का उपयोग करके एंड्रॉइड के लिए गेम लूप बनाने का सबसे अच्छा तरीका मैंने जो देखा है उससे, यदि मैं एक गैर-ओपनग्लू गेम लूप बनाना चाहता हूं तो मैं एक गेम थ्रेड कर सकता हूं कि लूप के दौरान गेम स्थिति अपडेट हो जाएगी (या गेम भौतिकी) और Canvas
को एक सामान्य (0) SurfaceView
से कैनवास.drawXXX (...) विधियों के माध्यम से ड्राइंग करके और फिर इसे अनलॉक करके ग्राफिक्स को लूप के लिए अपडेट करने के बिंदु पर लॉक करके ग्राफिक्स को अपडेट करें।OpengGLSurface
मुझे GLSurfaceView
और Renderer
का उपयोग करते समय वास्तव में ऐसा करने का तरीका नहीं मिलता है। जो मैं समझता हूं, उससे अब मेरे हाथ से बने गेम थ्रेड ड्रॉ पर मांग नहीं हो सकती है क्योंकि मेरे पास नियमित सतह थी और यह Canvas
है, क्योंकि अब एक प्रतिपादन धागा है जो Renderer.onDrawFrame()
पर कॉल करेगा (मेरे द्वारा पारित रेंडरर क्लास के कार्यान्वयन पर GLSurfaceView के लिए)।
मेरा प्रश्न तब है, GLSurfaceView और Renderer के साथ गेम लूप बनाने का एक अच्छा तरीका क्या है? क्या मुझे अभी भी अपना अलग गेम थ्रेड बनाना चाहिए, लेकिन इसमें केवल गेम स्टेटस (भौतिकी) अपडेट को संभालना चाहिए और उसके बाद वर्तमान स्थिति के आधार पर ग्राफिक्स को वास्तव में आकर्षित करने के लिए Renderer.onDrawFrame() के कार्यान्वयन में उस गेम स्थिति का उपयोग करना चाहिए? क्या मुझे केवल राज्य अपडेट करने के लिए रेंडर के धागे का उपयोग करना चाहिए?
तो onDrawFrame() अपने खेल के "अद्यतन" के रूप में प्रयोग नहीं है बुरा व्यवहार:
Android और ओपन यहां पर एक बड़ा ट्यूटोरियल नहीं है? मैं अभी एक गेम प्रोटोटाइप कर रहा हूं - बिना किसी मेमोरी ऑलॉक्स के चिकनी 60 एफपीएस को दबा रहा हूं और सोच रहा हूं कि मुझे शायद अपने धागे को विभाजित करना चाहिए। – torger
ठीक है, केवल जीएलएसयूफ़ेस के थ्रेड का उपयोग करने का मतलब है कि आपके गेम में 2 प्रमुख धागे होंगे: मुख्य थ्रेड, जो इस सेटअप में होगा, ज्यादातर यूआई इनपुट और ऐसे जीएलएसयूफेस थ्रेड को संभालेगा जो आपके गेम स्टेटस और ग्राफिक्स को अपडेट करेगा। मैंने इस सेटअप का उपयोग किया है और यह ठीक काम करता है। आपको केवल सावधान रहना होगा कि आप मुख्य थ्रेड से उपयोगकर्ता इनपुट को GLSurface थ्रेड (दौड़ की स्थिति से बचें) कैसे पास करते हैं। इसके अलावा, मैंने कुछ विदेशी सेटअप देखे हैं जहां आपके पास अन्य सामानों को संभालने के लिए तीसरा (या इससे भी अधिक) धागा है, लेकिन मुझे इसकी आवश्यकता महसूस नहीं हुई। –
सबसे अच्छा तरीका, स्पष्ट रूप से, GLSurfaceView का उपयोग नहीं करना है। पुराने SurfaceView योजना का उपयोग करें और ईजीएल सेटअप और थ्रेड प्रबंधन स्वयं करें। यह अधिक काम है, लेकिन आप बेहतर परिणाम प्राप्त कर सकते हैं। एंड्रॉइड गेम लूप की लंबी चर्चा यहां उपलब्ध है: https://source.android.com/devices/graphics/architecture.html#loops। ग्राफिका में नमूना कोड (https://github.com/google/grafika)। – fadden