मेरे पास एक क्रॉस-प्लेटफ़ॉर्म कोड बेस (आईओएस और एंड्रॉइड) है जो एक मानक रेंडर-टू-बनावट सेटअप का उपयोग करता है। प्रत्येक फ्रेम (आरंभीकरण के बाद), निम्न क्रम होता है:रेंडर-टू-बनावट और सिंक्रनाइज़ेशन
- एक बनावट रंग लगाव के साथ एक फ्रेमबफर की glBindFramebuffer
- एंड्रॉयड पर कुछ सामान
- *
- डिफ़ॉल्ट फ्रेमबफर की glBindFramebuffer (0 प्रस्तुत, आम तौर पर 2 iOS पर)
- बनावट बाध्य बनावट का उपयोग कर कि पहले फ्रेमबफर
- प्रस्तुत करने के लिए रंग लगाव था की glBindTexture
आईओएस और कुछ एंड्रॉइड डिवाइस (एम्यूलेटर सहित) पर, यह ठीक काम करता है और अपेक्षित है। अन्य उपकरणों पर (वर्तमान में सैमसंग गैलेक्सी नोट के सामने 4.0.4 चल रहा है), बनावट का उपयोग करने वाला दूसरा चरण प्रतिपादन "अजीब" दिखता है। अन्य एनिमेशन उसी स्क्रीन पर 60 एफपीएस पर चलते रहते हैं जैसे "अजीब" बिट्स; मेरा निष्कर्ष यह है कि लक्ष्य बनावट में परिवर्तन दूसरे प्रतिपादन पास में हमेशा दिखाई नहीं देते हैं।
इस सिद्धांत का परीक्षण करने के लिए, मैं ऊपर * के साथ चिह्नित चरण पर एक glfinish() डालता हूं। सभी उपकरणों पर, अब, इसका सही व्यवहार है। दिलचस्प बात यह है कि glFlush() समस्या को ठीक नहीं करता है। लेकिन glfinish() महंगा है, और मैंने कोई दस्तावेज नहीं देखा है जो बताता है कि यह आवश्यक होना चाहिए।
तो, यहां मेरा प्रश्न है: यह सुनिश्चित करने के लिए कि जब हाल ही में तैयार किए गए बनावट बाद में प्रतिपादन पास में उपलब्ध हो, तो मुझे क्या करना चाहिए?
उचित ओपनजीएल व्यवहार की तरह नहीं लगता है। मैं एक ईएस विशेषज्ञ नहीं हूं, लेकिन मुझे पूरा यकीन है कि ईएस (कम से कम spec द्वारा) इस मूल सिंक्रनाइज़ेशन व्यवहार को नहीं बदलता है। अगर आप इसे पकड़ नहीं पाएंगे, तो आप कुछ भी भरोसा नहीं कर सकते हैं, जैसे प्रतिपादन से पहले बफर लिखने पर निर्भर होना। उन परिचालनों के लिए कोई अन्य स्पष्ट सिंक्रनाइज़ेशन तंत्र नहीं हैं, इसलिए कमांड कतार अनुक्रमिक रूप से सिंक्रनाइज़ किया जाना चाहिए। –
और मैं इसे किसी और ने नहीं देखा है? निश्चित रूप से उपकरण/निर्माण विशिष्ट हो सकता है, लेकिन यह कोई मजेदार नहीं है। – addaon