मैं मोबाइल प्लेटफ़ॉर्म (एस) के लिए स्प्राइट आधारित 2 डी गेम विकसित कर रहा हूं और ग्राफिक्स रेंडर करने के लिए ओपनजीएल (अच्छी तरह से, वास्तव में इरक्लिक्ट) का उपयोग कर रहा हूं। पहले मैंने स्प्रैट रेंडरिंग को एक सरल तरीके से लागू किया: प्रत्येक गेम ऑब्जेक्ट को अपने स्वयं के GPU ड्रॉ कॉल के साथ क्वाड के रूप में प्रस्तुत किया जाता है, जिसका अर्थ है कि अगर मेरे पास 200 गेम ऑब्जेक्ट्स थे, तो मैंने प्रति फ्रेम 200 कॉल कॉल की। बेशक यह एक बुरा विकल्प था और मेरा गेम पूरी तरह से सीपीयू से बँधा हुआ था क्योंकि हर जीपीयू ड्रॉ कॉल में थोड़ा-बहुत सीपीयू ओवरहेड एसोसियेटेड होता है। GPU ज्यादातर समय निष्क्रिय रहा।
अब, मैंने सोचा कि मैं बड़े बैचों में वस्तुओं को इकट्ठा करके और केवल कुछ ड्रॉ कॉल के साथ इन बैचों को प्रस्तुत करके प्रदर्शन में सुधार कर सकता हूं। मैंने बैचिंग लागू की (ताकि हर गेम ऑब्जेक्ट एक ही बनावट को साझा करते हुए एक ही बैच में प्रस्तुत किया गया है) और सोचा कि मेरी समस्याएं दूर हो गई हैं ... केवल यह पता लगाने के लिए कि मेरी फ्रेम दर पहले की तुलना में भी कम थी।
क्यों? खैर, मेरे पास 200 (या अधिक) गेम ऑब्जेक्ट हैं, और वे प्रति सेकंड 60 बार अपडेट किए जाते हैं। हर फ्रेम मुझे सीपीयू में वर्टिकल के लिए नई स्थिति (अनुवाद और रोटेशन) को पुनर्गणना करना पड़ता है (मोबाइल प्लेटफॉर्म पर जीपीयू इंस्टेंटिंग का समर्थन नहीं करता है इसलिए मैं इसे वहां नहीं कर सकता), और यह गणना प्रति सेकंड 48000 (200 * 60 * 4) हर स्प्राइट में 4 वर्टीकल होते हैं) बस बहुत धीमा लगता है।
प्रदर्शन को बेहतर बनाने के लिए मैं क्या कर सकता था? सभी गेम ऑब्जेक्ट्स हर फ्रेम को घुमाते / घुमाते (लगभग) करते हैं इसलिए मुझे वास्तव में वर्टेक्स पोजीशन को रिकॉल करना है। केवल अनुकूलन जो मैं सोच सकता था कि रोटेशन के लिए एक लुक-अप तालिका है ताकि मुझे उनकी गणना न करनी पड़े। अंक स्प्राइट मदद करेगा? कोई गंदा हैक? और कुछ?
धन्यवाद।