मैंने आईओएस पर छवि प्रदर्शन का परीक्षण करने के लिए एक ऐप लिखा है। मैंने 3 अलग-अलग विचारों की कोशिश की है, सभी एक ही बड़े पीएनजी प्रदर्शित करते हैं। पहला ऐसा दृश्य है जो CGContextDrawImage() का उपयोग करता है। दूसरा सेट self.layer.content। तीसरा एक सादा UIImageView है।UIImageView या तो सीजी या कैलियर से बहुत तेज प्रदर्शित करता है। किसी को पता है क्यों?
उपयोग की गई छवि का उपयोग - [UIImage initWithContentsOfData:] और व्यू कंट्रोलर में कैश किया गया है। प्रत्येक परीक्षण बार-बार एक दृश्य को आवंटित करता है, इसे दृश्य पदानुक्रम में जोड़ता है और फिर इसे हटा देता है और इसे रिलीज़ करता है। लोडव्यू की शुरुआत से समय लिया जाता है ताकि डीडएपियर को देखा जा सके और एफपीएस के रूप में दिया जा सके (प्रभावी रूप से प्रति सेकंड ड्रॉ देखें)।
CGContext: 11 fps
CALayer: 10 fps
UIImageView: 430 fps (!)
Am मैं hallucinating:
यहाँ एक 912 x 634 बगैर माप छवि का उपयोग कर 5.1 चल रहा एक iPad 1 से परिणाम कर रहे हैं? ऐसा लगता है कि UIImageView उस तेजी से आकर्षित कर सकता है, लेकिन मैं वास्तव में छवियों झिलमिलाहट देख सकते हैं। मैंने संभावित कैशिंग को हराने के लिए दो समान विचारों के बीच स्वैपिंग करने की कोशिश की, लेकिन फ्रेम दर भी अधिक थी।
मैंने हमेशा यह माना था कि UIImageView केवल एक रैपर था - [CALayer setContent]। हालांकि, UIImageView प्रोफाइलिंग किसी भी ड्राइंग विधि में लगभग कोई समय बिताता है जिसे मैं पहचान सकता हूं।
मुझे यह समझना अच्छा लगेगा कि क्या हो रहा है। कोई भी सहायता सराहनीय होगी।
कृपया प्रत्येक प्रश्न में आपके द्वारा दिए गए कोड को शामिल करने के लिए अपना प्रश्न संपादित करें, या इसके लिए एक लिंक शामिल करें। –
कोड हमारे मालिकाना गेम कोड का परीक्षण करने के लिए उपयोग किए जाने वाले एक बड़े ऐप का हिस्सा है। प्रासंगिक बिट्स को खींचने में कुछ घंटे लगेंगे। इस बीच, मुझे उपर्युक्त विवरण से आप जो भी विशिष्ट विवरण खो रहे हैं, उसे भरने में मुझे खुशी होगी। –
"लोडव्यू की शुरुआत से समय निकाल दिया जाता है ताकि डीडएपियर देखने के लिए" - यह थोड़ा बोगस लगता है, क्योंकि वास्तव में स्क्रीन पर दिखाई देने से पहले 'viewDidAppear' को कॉल किया जा सकता है।यदि आप स्क्रीन को अपडेट करने के लिए मजबूर नहीं कर रहे हैं, तो आप वास्तव में कुछ भी उपयोगी नहीं कर रहे हैं; आप कई UIImageViews बना और नष्ट कर सकते हैं लेकिन केवल एक ही वास्तव में खींचा जाता है। मुझे आश्चर्य है कि क्या UIImageView '-layoutSubviews' में अपनी परत की सामग्री ऑन-डिमांड सेट कर रहा है - यह निश्चित रूप से मैं यह कैसे करूँगा, यह सुनिश्चित करने के लिए कि मैंने प्रति स्क्रीन अपडेट केवल एक बार परत को छुआ था। –