2012-02-14 20 views
11

का उपयोग करके एंड्रॉइड के लिए गेम लूप बनाने का सबसे अच्छा तरीका मैंने जो देखा है उससे, यदि मैं एक गैर-ओपनग्लू गेम लूप बनाना चाहता हूं तो मैं एक गेम थ्रेड कर सकता हूं कि लूप के दौरान गेम स्थिति अपडेट हो जाएगी (या गेम भौतिकी) और Canvas को एक सामान्य (0) SurfaceView से कैनवास.drawXXX (...) विधियों के माध्यम से ड्राइंग करके और फिर इसे अनलॉक करके ग्राफिक्स को लूप के लिए अपडेट करने के बिंदु पर लॉक करके ग्राफिक्स को अपडेट करें।OpengGLSurface

मुझे GLSurfaceView और Renderer का उपयोग करते समय वास्तव में ऐसा करने का तरीका नहीं मिलता है। जो मैं समझता हूं, उससे अब मेरे हाथ से बने गेम थ्रेड ड्रॉ पर मांग नहीं हो सकती है क्योंकि मेरे पास नियमित सतह थी और यह Canvas है, क्योंकि अब एक प्रतिपादन धागा है जो Renderer.onDrawFrame() पर कॉल करेगा (मेरे द्वारा पारित रेंडरर क्लास के कार्यान्वयन पर GLSurfaceView के लिए)।

मेरा प्रश्न तब है, GLSurfaceView और Renderer के साथ गेम लूप बनाने का एक अच्छा तरीका क्या है? क्या मुझे अभी भी अपना अलग गेम थ्रेड बनाना चाहिए, लेकिन इसमें केवल गेम स्टेटस (भौतिकी) अपडेट को संभालना चाहिए और उसके बाद वर्तमान स्थिति के आधार पर ग्राफिक्स को वास्तव में आकर्षित करने के लिए Renderer.onDrawFrame() के कार्यान्वयन में उस गेम स्थिति का उपयोग करना चाहिए? क्या मुझे केवल राज्य अपडेट करने के लिए रेंडर के धागे का उपयोग करना चाहिए?

उत्तर

5

ठीक है, जैसा कि यह पता चला है, GLSurface द्वारा प्रदान किए गए थ्रेड का उपयोग करने का सबसे अच्छा तरीका है। इसके लिए हुक रेंडरर इंटरफेस के कार्यान्वयन के माध्यम से आता है। प्रभावी रूप से रेंडरर की ऑन ड्राफ्रेम() विधि को नियमित थ्रेड की रन() विधि के समान समझा जा सकता है। इस तरह की खिड़की प्रति सेकंड प्रतिमान एक निश्चित अद्यतन की अवधारणा को फेंकता है (वास्तव में नहीं, लेकिन यह इस संदर्भ में करने के लिए बहुत ही जटिल है) लेकिन दूसरी तरफ आपको इष्टतम ग्राफिक्स अपडेट मिलते हैं।

http://insanitydesign.com/wp/projects/nehe-android-ports/

+0

तो onDrawFrame() अपने खेल के "अद्यतन" के रूप में प्रयोग नहीं है बुरा व्यवहार:

Android और ओपन यहां पर एक बड़ा ट्यूटोरियल नहीं है? मैं अभी एक गेम प्रोटोटाइप कर रहा हूं - बिना किसी मेमोरी ऑलॉक्स के चिकनी 60 एफपीएस को दबा रहा हूं और सोच रहा हूं कि मुझे शायद अपने धागे को विभाजित करना चाहिए। – torger

+1

ठीक है, केवल जीएलएसयूफ़ेस के थ्रेड का उपयोग करने का मतलब है कि आपके गेम में 2 प्रमुख धागे होंगे: मुख्य थ्रेड, जो इस सेटअप में होगा, ज्यादातर यूआई इनपुट और ऐसे जीएलएसयूफेस थ्रेड को संभालेगा जो आपके गेम स्टेटस और ग्राफिक्स को अपडेट करेगा। मैंने इस सेटअप का उपयोग किया है और यह ठीक काम करता है। आपको केवल सावधान रहना होगा कि आप मुख्य थ्रेड से उपयोगकर्ता इनपुट को GLSurface थ्रेड (दौड़ की स्थिति से बचें) कैसे पास करते हैं। इसके अलावा, मैंने कुछ विदेशी सेटअप देखे हैं जहां आपके पास अन्य सामानों को संभालने के लिए तीसरा (या इससे भी अधिक) धागा है, लेकिन मुझे इसकी आवश्यकता महसूस नहीं हुई। –

+0

सबसे अच्छा तरीका, स्पष्ट रूप से, GLSurfaceView का उपयोग नहीं करना है। पुराने SurfaceView योजना का उपयोग करें और ईजीएल सेटअप और थ्रेड प्रबंधन स्वयं करें। यह अधिक काम है, लेकिन आप बेहतर परिणाम प्राप्त कर सकते हैं। एंड्रॉइड गेम लूप की लंबी चर्चा यहां उपलब्ध है: https://source.android.com/devices/graphics/architecture.html#loops। ग्राफिका में नमूना कोड (https://github.com/google/grafika)। – fadden