2012-04-12 12 views
8

का संयोजन मैं एक आईपी * गेम विकसित कर रहा हूं और मैं यूआईकिट और ओपनजीएल ईएस 2.0 दोनों का उपयोग करता हूं। UIKit तत्व ओपनजीएल दृश्य पर प्रस्तुत किए जाते हैं और स्क्रीन स्पेस की एक महत्वपूर्ण (मनमाना) राशि पर कब्जा करते हैं। मुझे यह स्वीकार करना होगा कि ऐप्पल ने एक उत्कृष्ट काम किया है और खेल की फ्रेम दर हमेशा 60 एफपीएस है।UIView एनीमेशन ब्लॉक और ओपनजीएल ईएस रेंडरिंग

आदेश में इस निष्कर्ष पर पहुंचा में मैं प्रदर्शन के बारे में कई परीक्षण किए गए:

  1. मैं ओपन दृश्य में UIViews स्थिर के बहुत सारे (नहीं चलती) जोड़ा - ठीक है!
  2. मैं कस्टम कोड का उपयोग करके एनिमेटेड एक ही UIViews (मेरे गेम के ड्रॉफ्रेम विधि में केंद्र संपत्ति को संशोधित) - ठीक है!
  3. मैंने UIViews के तहत कई ओपनजीएल ES तत्व जोड़े - ठीक है!
  4. मैंने UIViews के तहत कई चल रहे OpenGL ES तत्व जोड़े - ठीक है!

तो, अब मैं UIKit तत्वों को एनिमेट करने के लिए कोर एनीमेशन फ्रेमवर्क का उपयोग करना चाहता हूं। मैं

[UIView animateWithDuration:delay:options:animations:completion:] 

एनीमेशन करने के लिए ओडर में (मैं आईओएस 4 या नए को लक्षित करता हूं) का उपयोग करता हूं।

समस्या अब है कि फ्रेम दर इस अजीब व्यवहार है: कभी कभी मैं कई कई UIKit एनिमेट तत्वों के साथ 60 fps (30 तत्वों मेरे लिए ठीक है) हो जाते हैं और कुछ अन्य समय फ्रेम दर के तहत स्पष्ट रूप से है एकल एनिमेटिंग UIKit तत्व के साथ 60 एफपीएस भी है लेकिन मैं इसे इंस्ट्रूमेंट्स के साथ माप नहीं सकता! मुझे और बताएं: जब मैं इंस्ट्रूमेंट खोलता हूं और कोर एनीमेशन और/या ओपनजीएल ड्राइवर की निगरानी करता हूं तो मुझे हमेशा 60 एफपीएस मिलते हैं। लेकिन यह स्पष्ट है कि यह मामला नहीं है, मैं ओपनजीएल एनिमेशन को शीर्ष पर संबंधित UIKit एनिमेशन की तुलना में बहुत धीमी गति से स्थानांतरित करने के लिए देख सकता हूं। यदि मैं दृश्य से UIKit तत्वों को हटा देता हूं तो फ्रेम दर सामान्य पर वापस आती है। जैसा कि मैंने वर्णन किया है, उसके साथ एक समान स्थिति किसी भी ओपनजीएल ईएस गेम में होती है जब उपयोगकर्ता गेम खेलने के दौरान डिवाइस की मात्रा बदलता है। जब पारदर्शी दृश्य जो दिखाता है कि वर्तमान वॉल्यूम खराब हो जाता है और जब तक यह पूरी तरह से फिसल जाता है तो फ्रेम दर बहुत कम हो जाती है, लेकिन उपकरणों में (मैंने यह परीक्षण भी किया है) यह 60 एफपीएस पर फंस गया है!

तो, समेकित करने के लिए: कभी-कभी मुझे ब्लॉक एनीमेशन के साथ वास्तविक 60 एफपीएस मिलते हैं, बिना किसी अप और डाउन के चलते और कुछ अन्य बार मुझे कोई अप और डाउन के साथ नकली 60 एफपीएस मिलते हैं।

क्या आपके पास इसका कोई समाधान है? सभी परीक्षणों आईओएस 5.1 के साथ

उत्तर

9

मैं समस्या को हल करने में कामयाब रहे और अब मैं किसी भी प्रदर्शन बूंद के बिना मेरे ओपन खेल में UIView ब्लॉक/कोर आधारित एनिमेशन गठजोड़ कर सकते हैं एक iPad 2 और iPhone 3GS पर प्रदर्शन किया गया।

समाधान काफी सरल है:

  1. प्रत्येक UIView है कि आप अपने ओपन अनुप्रयोग में लिए, अपनी सीमा, केंद्र रखने और अपने ओपन स्क्रीन समन्वय प्रणाली में गुण को बदलने (जैसे निम्नलिखित गुण बनाएँ: GLBounds, GLCenter, GLTranform) और जब भी आप संबंधित UIView गुणों में से किसी एक को बदलते हैं तो तदनुसार उन्हें अपडेट करें।
  2. जब आप खेल शुरू करते हैं, तो UIViews लोड करें लेकिन उन्हें पर छिपाएं पर सेट करें।तो, UIKit OpenGL व्यू के शीर्ष पर नहीं खींचता है (इस तरह फ्रेम ड्रॉप समस्या पूरी तरह से समाप्त हो जाती है)। इसके बाद चरण 1 में बनाए गए जीएल * गुणों का उपयोग करके UIViews को स्वयं खींचें और संबंधित बनावट का उपयोग करें (छवियां/रंग जो आप प्रत्येक UIView के लिए उपयोग करते हैं)।
  3. छिपा एनीविज गुण (सीमाएं, केंद्र और परिवर्तन) को एनीमेशन के आधार पर ब्लॉक/कोर एनीमेशन का उपयोग करके एनिमेट करें (जो बदले में आपके जीएल * गुणों को अपडेट करता है) और आपके ओपनजीएल ड्रा विधि में जीएल * UIViews आकर्षित करने के लिए गुण! जब UIView एनिमेटिंग हो रहा है (और जीएल * गुणों को अपडेट करें) के लिए वास्तविक मान प्राप्त करने के लिए सीमाएं, केंद्र और रूपांतरण के लिए वास्तविक मान प्राप्त करने के लिए इसकी प्रस्तुति लेयर प्रॉपर्टी का उपयोग करें।

बेस्ट,