2010-03-23 17 views
6

में बनावट लोडिंग मैं सोच रहा था कि कोई एंड्रॉइड जावा & ओपनजीएल ईएस ऐप में बनावट लोड करने के लिए एक अच्छा पैटर्न पर सलाह दे सकता है।एंड्रॉइड ओपनजीएल ईएस ऐप

मेरी पहली चिंता यह निर्धारित कर रही है कि मेरे वर्टिसेस को प्रस्तुत करने से पहले कितने बनावट नाम आवंटित किए जाएंगे और मैं इसे कुशलतापूर्वक कैसे कर सकता हूं।

मेरी दूसरी चिंता बनावट को लोड करने में है, मुझे अपने गेम डेटा के आधार पर बनावट को लोड करना है। इसका मतलब है कि मैं तारों के साथ खेल रहा हूं, जो मैं समझता हूं वह कुछ है जो मुझे वास्तव में मेरे जीएल थ्रेड में नहीं करना चाहिए।

कुल मिलाकर मैं समझता हूं कि बनावट लोड करते समय क्या हो रहा है, मैं बस इसे सर्वश्रेष्ठ जीवन चक्र प्राप्त करना चाहता हूं। क्या कोई अन्य चीजें हैं जिन पर मुझे विचार करना चाहिए?

उत्तर

14

1) आपको जितनी आवश्यकता हो उतनी बनावट नाम आवंटित करना चाहिए। आप जिस बनावट का उपयोग कर रहे हैं उसके लिए एक।

एक बनावट लोड करना एक बहुत ही भारी ऑपरेशन है जो प्रतिपादन पाइपलाइन को रोकता है। इसलिए, आपको अपने गेम लूप के अंदर कभी भी बनावट लोड नहीं करना चाहिए। आपके पास उस एप्लिकेशन स्थिति से पहले लोडिंग स्थिति होनी चाहिए जिसमें आप बनावट प्रस्तुत करते हैं। लोडिंग स्थिति प्रतिपादन में आवश्यक सभी बनावट लोड करने के लिए ज़िम्मेदार है। तो जब आपको अपनी ज्यामिति प्रस्तुत करने की आवश्यकता होती है, तो आपके पास सभी बनावट लोड हो जाएंगी और आपको इसके बारे में चिंता करने की ज़रूरत नहीं है।

ध्यान दें कि अब आपको बनावट की आवश्यकता नहीं होने के बाद, आपको glDeleteTextures का उपयोग करके उन्हें हटाना होगा।

2) यदि आप अनुमान लगाते हैं कि आपको विभिन्न स्तरों या कुछ समान के लिए अलग-अलग बनावट की आवश्यकता है, तो आपको लोडिंग स्थिति में स्तर डेटा को संसाधित करना चाहिए और यह तय करना चाहिए कि कौन से बनावट को लोड करने की आवश्यकता है।

दूसरी तरफ, यदि आपको पाठ (वर्तमान स्कोर की तरह) पेंट करने की आवश्यकता है, तो ओपनजीएल में चीजें अधिक जटिल हो जाती हैं। आपके पास निम्न विकल्प होंगे: आवश्यक टेक्स्ट को बनावट (आसान) में प्रस्तुत करें, अपने स्वयं के बिटमैप फ़ॉन्ट इंजन (कड़ी मेहनत) को लागू करें या फ्लाई (धीमी) पर बनावट उत्पन्न करने के लिए बिटमैप और कैनवास जोड़ी का उपयोग करें।

यदि आपके पास गेम के दौरान दिखाए जाने वाले संदेशों का सीमित सेट है, तो मैं संभवतः उन्हें बनावट के रूप में प्रस्तुत करना होगा क्योंकि कार्यान्वयन बहुत छोटा है।

वर्तमान स्कोर के लिए यह एक बनावट है जिसमें 0 से 9 तक की संख्या के लिए ग्लिफ है और इसका उपयोग मनमाने ढंग से मूल्य प्रदान करने के लिए किया जाता है। कार्यान्वयन काफी सरल होगा।

यदि आपको लंबे समय तक स्थानीयकृत ग्रंथों की आवश्यकता है तो आपको फ्लाई पर उत्पन्न बनावट के बारे में सोचना शुरू करना होगा। असल में आप एक बिटमैप बनायेंगे जिसमें आप कैनवास का उपयोग करके पाठ प्रस्तुत करते हैं। फिर आप इसे एक बनावट के रूप में अपलोड करेंगे और इसे किसी भी अन्य बनावट के रूप में प्रस्तुत करेंगे। इसके बाद आपको इसकी आवश्यकता नहीं है, तो आप इसे हटा देंगे। यह विकल्प धीमा है और एप्लिकेशन लूप के अंदर से बचा जाना चाहिए।

3) बनावट के बारे में और जीपीयू से सबसे अच्छा पाने के लिए आपको कम से कम निम्नलिखित चीजों को अपने दिमाग में रखना चाहिए (इन चीजों को थोड़ा अधिक उन्नत मिलेगा, और आपको एप्लिकेशन प्राप्त करने के बाद ही उनके साथ परेशान होना चाहिए ऊपर और चलने और यदि आपको फ्रेम दर को अनुकूलित करने की आवश्यकता है):

  • बनावट परिवर्तन को कम करें क्योंकि यह धीमा ऑपरेशन है। सबसे अच्छा आपको बैच में एक ही बनावट का उपयोग करके सभी ऑब्जेक्ट्स प्रस्तुत करना चाहिए। फिर बनावट को बदलें और ऑब्जेक्ट्स को प्रस्तुत करने की आवश्यकता है।
  • उपयोग बनावट एटलस बनावट (और बनावट में परिवर्तन)
  • की संख्या को कम करने के लिए आप बनावट के बहुत सारे है, तो आप 8888 के अलावा अन्य बिट गहराई का उपयोग करने के लिए स्मृति में फिट करने के लिए अपने सभी बनावट बनाने की जरूरत सकता है। कम बिट गहराई का उपयोग प्रदर्शन में भी सुधार कर सकते हैं।
+2

जब आप "लोडिंग स्टेटस" कहते हैं, तो क्या यह ठीक है क्योंकि मैं अपने प्रस्तुतकर्ता को प्रारंभ करता हूं? मेरी वर्तमान सोच यह है कि यह मेरे दृश्य ग्राफ को प्रारंभ करना है और उन दृश्यों के लिए दृश्य ग्राफ़ में सभी ऑब्जेक्ट्स को क्वेरी करना है जिन्हें वे अनुरोध करना समाप्त कर देंगे (उन्हें गेम मॉडल से अनुमानित नाम देकर)। प्रत्येक ऑब्जेक्ट जिसने एक बनावट का अनुरोध किया है, उसके बाद उन टेक्सचर के संबंधित ओपनजीएल पूर्णांक "नाम" के साथ प्रदान किया जाएगा। क्या यह ध्वनि लगता है? –

+2

मुझे राज्य मशीनों का उपयोग कर उच्च स्तरीय एप्लिकेशन तर्क मॉडल करना पसंद है। इस प्रकार शब्द लोडिंग शब्द। यह वही करने के लिए पूरी तरह से ठीक है जब आप शेष प्रारंभिक कार्य करते हैं। यह सिर्फ एक बात है कि आप अपने आवेदन तर्क को कैसे डिजाइन करना चाहते हैं। तो यह ध्वनि प्रतीत होता है। – Lauri

2

इस Lauri के जवाब के लिए एक टिप्पणी होना चाहिए, लेकिन मैं 1 प्रतिनिधि के साथ टिप्पणी नहीं कर सकता, और वहाँ एक बात यह है कि कहा जा सकता है:

आप चाहिए फिर से लोड बनावट हर बार अपने ईजीएल संदर्भ खो गया है (यानी जब आपके अनुप्रयोग पृष्ठभूमि में डाल दिए जाते हैं और फिर वापस आते हैं)। इसलिए, उन्हें लोड करने के लिए सही स्थान

public void onSurfaceChanged(GL10 gl, int width, int height) 

रेंडरर में है। जाहिर है, यदि आपके पास अलग-अलग बनावट सेट किए गए हैं (यानी) गेम स्तर पर आप तब खेल रहे हैं जब आप स्तर बदलते हैं तो आपको उन टेक्सचर को हटाना चाहिए जिन्हें आप उपयोग नहीं करेंगे और नए बनावट लोड नहीं करेंगे। साथ ही, आपको ईजीएल संदर्भ खो जाने पर आपको फिर से लोड करने के लिए क्या करना है, इसका ट्रैक रखना होगा।

संबंधित मुद्दे