मेरे पास ओपनजीएल का उपयोग करने का एक बहुत ही बुनियादी ज्ञान है, खासकर एंड्रॉइड पर। मैं एक ऐप विकसित कर रहा हूं जो पूर्ण स्क्रीन छवियों के बीच एक तेज़ तरीके से स्विच करने के लिए ओपनजीएल का उपयोग करता है (क्योंकि यह सामान्य एंड्रॉइड फ्रेमवर्क का उपयोग करके बहुत धीमा है)।ओपनजीएल ES में बनावट को लोड करने के लिए कुशलतापूर्वक
क्या मैं पाया है कि आदेश बनावट लोड करने के लिए, मैं की तरह कुछ करने की ज़रूरत है:
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(vertices.length * 4);
byteBuffer.order(ByteOrder.nativeOrder());
vertexBuffer = byteBuffer.asFloatBuffer();
vertexBuffer.put(vertices);
vertexBuffer.position(0);
byteBuffer = ByteBuffer.allocateDirect(texture.length * 4);
byteBuffer.order(ByteOrder.nativeOrder());
textureBuffer = byteBuffer.asFloatBuffer();
textureBuffer.put(texture);
textureBuffer.position(0);
_gl = gl;
final Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), _imageResourceId);
gl.glGenTextures(1, textures, 0);
gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
bitmap.recycle();
अब, के बाद से छवियों (पूर्ण स्क्रीन के लिए हैं और वे काफी बड़े हैं - 1024x1024), इसमें कुछ समय लगता है, खासकर जब से मुझे एक ही समय में उनमें से 5 लोड करना होगा।
तो मैं, कोड में सुधार के सुझाव दिए गए के बारे में कुछ सवाल पूछना विशेष रूप से कुशल लोड हो रहा है के बारे में की जरूरत है (लेकिन यह भी कम स्मृति का उपयोग कर यदि संभव हो तो):
अगर मैं बिटमैप डिकोड पारदर्शिता पिक्सल की जरूरत नहीं करने के लिए, RGB_565 प्रारूप का उपयोग करके, क्या यह छवियों को OpenGL (या डिकोडिंग चरण) में लोड करने की गति को बढ़ावा देगा?
क्या इनपुट बिटमैप में चौड़ाई और ऊंचाई होना चाहिए जो 2 की शक्तियां हैं या क्या मैं ओपनजीएल को केवल वह हिस्सा ले सकता हूं जो यह चाहता है, जिसमें यह नियम होगा? मेरा मतलब है, शायद मैं बिटमैप का केवल एक हिस्सा लेने के लिए
texImage2D
कमांड कर सकता हूं?शायद मैं केवल शुरुआत से ही इस भाग को डीकोड कर सकता हूं (इसलिए यदि मेरे पास 10000x10000 की एक बड़ी छवि है, तो मैं केवल 1024x1024 भाग को डीकोड कर सकता हूं और इसे ओपनजीएल को दे सकता हूं)?
क्या यह केवल पहली छवि लोड करना और दिखाया जा सकता है, और पृष्ठभूमि में शेष लोड? मैंने सुना है कि आप थ्रेडमैप को ओपनजीएल को थ्रेड में नहीं भेज सकते हैं जो कि इसे संभालने वाला नहीं है। क्या की विधि पर उन्हें लोड करने का अर्थ है, दूसरी बार इसे कॉल करने के लिए कहें?
मुझे याद है कि मैंने एक छवि में कई छवियों को विलय करने के बारे में एक टिप के बारे में सुना है (एक दूसरे के बाद, बाएं से दाएं), ताकि डीकोडिंग चरण के लिए कुछ गति वृद्धि हो। सुनिश्चित नहीं है कि इस तकनीक का नाम क्या है। क्या एंड्रॉइड पर ओपनजीएल ईएस के लिए अभी भी संभव है?
क्या बिटमैप उदाहरण बनाने से बचने और डीकोडिंग को अधिक देशी तरीके से (एनडीके, शायद) में करना संभव है? मेरे परीक्षणों के अनुसार, एक एमुलेटर पर आकार 1024x1024 की पीएनजी फ़ाइल को डीकोड करने से लगभग 400ms-700ms लगते हैं, फिर भी इसे ओपनजीएल में भेजकर लगभग 50ms-70ms लगता है।
प्रोक्रैंक का उपयोग करके, मुझे पता चला है कि ओपनजीएल बहुत मेमोरी ले सकता है। क्या इसे कम स्मृति का उपयोग करना संभव है? शायद बेहतर बनावट प्रकार का उपयोग करें?
चूंकि एंड्रॉइड कई प्रकार के उपकरणों पर काम कर सकता है, क्या मैनिफेस्ट में यह आवश्यक है कि ऐप चलाने के लिए कितनी मेमोरी की आवश्यकता हो, ताकि बहुत कम स्मृति वाले लोग सक्षम न हों इसे स्थापित करो?
@Majid मैक्स:
तो यह इस तरह से डिकोड और ओपन को भेजने के लिए काफी है, या मैं भी कुछ खास स्थापित करना चाहिए जब OpenGL पर भेजने?
बिटमैप का आंशिक हिस्सा लेने के लिए ऐसा कोई आदेश नहीं है?
मेरा मतलब है, क्या मैं बिटमैप के बजाय बिटमैप में संग्रहीत करने के लिए फ़ाइल का केवल आंशिक हिस्सा डीकोड कर सकता हूं?
तो एकमात्र चीज मैं शुरुआत में सब कुछ लोड करने के लिए कर सकता हूं, और फिर इसका उपयोग कर सकता हूं? ऐसा कैसे हो सकता है? गेम इसे कैसे संभालते हैं? मेरा मतलब है, वे एक के बाद एक मंच दिखाते हैं, यहां तक कि ओपनजीएल उत्पन्न प्रगति पट्टी की तरह दिखने वाला कुछ भी। यह बहुत ही समस्याग्रस्त है।
जो मैं वर्णन कर रहा हूं वह वेब पर भी उपलब्ध है। उदाहरण के लिए, एकाधिक छोटी छवियों को लोड करने के बजाय, वेबपृष्ठ में एक ही छवि होती है और नक्शा दिखाता है कि इसका किस भाग को दिखाया जाना चाहिए। इसके लिए एक और नाम sprites है। उदाहरण here।
मुझे लगता है। मुझे लगता है कि मुझे glDeleteTextures भी कॉल करना चाहिए जब मुझे लगता है कि अब और उपयोग नहीं किया गया है, है ना?
मैं यह कैसे कर सकता हूं? कोड में मुझे क्या बदलना चाहिए?
जब मैं बहुत मेमोरी का उपयोग करता हूं तो क्या होता है? क्या कोई फ्री रैम नहीं होने पर वर्चुअल रैम (शायद आंतरिक स्टोरेज का उपयोग करता है) जैसी कोई चीज है? मैंने Google आईओ वीडियो पर इसके बारे में सुना है, लेकिन ऐसा लगता है कि वे उत्तर के बारे में भी निश्चित नहीं थे। लिंक here। जब उन्होंने ऐसी चीज होती है तो उन्होंने केवल अधिक दुर्घटनाओं की अपेक्षा की।
@Majid मैक्स:
1 + 2 + 3। ?
यह काम कर सकता है। आपका मतलब है कि मैं एक नया धागा बनाता हूं जो बिटमैप्स लोड करेगा, और फिर परिणाम को ओपनजीएल थ्रेड पर वापस भेज देगा जो बनावट को बिटमैप में बांध देगा? शायद मैं asyncTask के समान दृष्टिकोण का उपयोग कर सकता हूं, और प्रकाशन प्रगति का उपयोग कर सकता हूं।
यह भी एक अच्छी बात है। क्या आपके पास कोई लिंक है जिसके बारे में मुझे पढ़ना चाहिए? या शायद मेरे कोड में बदलने के लिए एक स्निपेट?
धन्यवाद।
इसलिए मुझे लगता है कि यह ईटीसी 1 का उपयोग करने की सबसे आसान बात है। हालांकि यह पारदर्शिता का समर्थन नहीं करता है, इसलिए this link के अनुसार, मुझे इसके लिए एक और बनावट का उपयोग करने की आवश्यकता है, लेकिन मुझे इसके लिए नमूना नहीं मिल रहा है।
मैं उपलब्ध स्मृति के बारे में क्या सोच सकता हूं जिसका मैं उपयोग कर सकता हूं? क्या मैं मान सकता हूं, उदाहरण के लिए, कि सभी एंड्रॉइड डिवाइस मुझे 200 एमबी वीडियो मेमोरी की पेशकश कर सकते हैं जिसे मैं ओपनजीएल के लिए उपयोग कर सकता हूं?
दुख की बात है कि मैं इसका उपयोग नहीं कर सकता क्योंकि मुझे एंड्रॉइड एपीआई और ओपनजीएल दोनों के साथ काम करने की ज़रूरत है। मुझे इस समाधान (और libGDX) के बारे में पता है। मुझे बस उनका उपयोग करने की अनुमति नहीं है, खासकर जब से मुझे दृश्य पेज में विचारों को रखना होगा। –