2013-11-14 5 views
8

मुझे पता है कि इसी तरह के सवाल से पहले कहा गया है में प्रदर्शन, लेकिन ...एंड्रॉयड केवल ओपन में खेल: सी ++ (NDK) बनाम जावा (Dalvik)

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

मैं जानता हूँ कि जावा के साथ बुनियादी समस्या कचरा संग्रहण है। लेकिन यह कोई मुद्दा नहीं है, हम खेल शुरू होने से पहले सभी आवश्यक स्मृति आवंटित करने की योजना बनाते हैं और क्षणिक वस्तुओं के लिए हम पूलिंग का उपयोग करेंगे (इसलिए गेम लूप में नया कीवर्ड कभी नहीं लिखा जाएगा)। और हम यहां वर्णित हर संभावित तकनीक का उपयोग करने की योजना बना रहे हैं (Google I/O 2009 - Writing Real-Time Games for Android)।

मुख्य कारण हम जावा पर जोर देते हैं तैनाती है और हम केवल Android के लिए विकसित करना चाहते हैं (अभी कम से कम)

तो एक खेल में एक ही प्रदर्शन जावा (साथ हासिल किया जा सकता है कि भले ही बदसूरत मतलब है/बेवकूफ कोड नहीं) जैसे कि हमने इसे सी ++ के साथ किया था। यदि नहीं, तो विनिर्देश क्या हैं? या शायद यदि यह संभव है लेकिन बहुत ही अनैतिक है तो इन कारण क्या हैं?

(उदाहरण के लिए मैं जावा बफ़र के बारे में कुछ पढ़ा है और ओपन सबसे अच्छा जोड़ी नहीं हैं, लेकिन बारीकियों याद नहीं है - हो सकता है कुछ विशेषज्ञ)

उत्तर

10

आप के लिए प्रति कॉल एक निश्चित अतिरिक्त लागत का भुगतान करने जा रहे हैं जावा स्रोत कोड से ओपनजीएल का उपयोग करें। एंड्रॉइड कॉल के चारों ओर जावा-भाषा रैपर प्रदान करता है। उदाहरण के लिए, यदि आप glDrawArrays पर कॉल करते हैं, तो आप GLES20.java में घोषित मूल विधि को कॉल कर रहे हैं, जिसे android_opengl_GLES20.cpp में परिभाषित किया गया है। आप कोड से देख सकते हैं कि यह कॉल को केवल न्यूनतम ओवरहेड के साथ अग्रेषित कर रहा है।

फाइल में चारों ओर नाउज़िंग, आप अन्य कॉल कि अतिरिक्त जांच करने और इसलिए थोड़ा अधिक महंगे हैं देख सकते हैं।

अपरिवर्तनीय लागतों की निचली पंक्ति यह है कि जीएसई कॉल करने की कीमत मूल स्रोत की तुलना में जावा स्रोत के साथ अधिक है। (systrace साथ Android Breakout के प्रदर्शन देखते हुए मैंने देखा वहाँ चालक में सीपीयू भूमि के ऊपर का एक बहुत था कि क्योंकि मैं अनावश्यक राज्य बहुत-से अपडेट कर रहा था। मूल कोड से ऐसा करने की लागत कम हो गया होता, लेकिन लागत शून्य काम करने की कम काम करने की लागत से कम है।)

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

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