2012-01-27 12 views
9

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

मैं कोड को प्रोफाइल करने के लिए Traceview का उपयोग कर रहा हूं, और टक्कर पहचान कोड का यह नया टुकड़ा कुछ हद तक आश्चर्यजनक रूप से मेरे गेम तर्क की अवधि दोगुना हो गया है। कुछ निश्चित उपकरणों के लिए यह स्पष्ट रूप से एक चिंता है, यह प्रदर्शन हिट मेरे खेल को एक नाटक योग्य राज्य से ले जा सकता है।

मैं इस कोड को अनुकूलित करने के विभिन्न तरीकों पर विचार कर रहा हूं, और मुझे आश्चर्य है कि कोड को C++ में ले जाकर और जेएनआई के साथ इसे एक्सेस करके, अगर मुझे कुछ ध्यान देने योग्य प्रदर्शन बचत मिल जाएगी?

उपरोक्त प्रश्न मेरी मुख्य चिंता और पूछने का मेरा कारण है। मैंने यह निर्धारित किया है कि जेएनआई का उपयोग करने से निम्नलिखित दो कारण अन्य सकारात्मक परिणाम होंगे। हालांकि, मुझे अपने कोड को सी ++ पर पोर्ट करने के लिए राजी करने के लिए पर्याप्त नहीं है।

  • यह कोड क्लीनर बना देगा। चूंकि टकराव का अधिकांश पता वेक्टर गणित का एक प्रकार है, इसलिए जावा में कुछ और वर्बोज वेक्टर कक्षाओं का उपयोग करने के बजाय अधिभारित ऑपरेटरों का उपयोग करने में सक्षम होना बहुत साफ है।

  • मेमोरी प्रबंधन आसान होगा। सरल आप कहते हैं? खैर, यह एक गेम है इसलिए कचरा कलेक्टर चल रहा है, इसलिए आपका स्वागत नहीं है क्योंकि जीसी आपके गेम के प्रदर्शन को बर्बाद कर सकती है अगर इसे लगातार साफ करने में बाधा आती है। सीआई में कचरा कलेक्टर के बारे में चिंता करने की ज़रूरत नहीं है, इसलिए मैं सभी बदसूरत बातें मैं अस्थायी स्थैतिक चर के साथ जावा में क्या से बच सकते हैं और सिर्फ सी ++

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

संपादित करें:

तो मैंने ऐसा किया। परिणाम? ट्रेसेव्यू के परिप्रेक्ष्य से, यह मेरी टकराव पहचान दिनचर्या की गति में 6x की वृद्धि थी।

हालांकि यह वहां आसान नहीं था। जेएनआई नृत्य करने के अलावा, मुझे कुछ अनुकूलन भी करना पड़ा जिनकी मुझे उम्मीद नहीं थी। मुख्य रूप से, जावा से मूल तक डेटा पास करने के लिए सीधे आवंटित फ्लोट बफर का उपयोग करना। मेरे प्रारंभिक प्रयास ने डेटा को प्रश्न में रखने के लिए केवल एक फ्लोट सरणी का उपयोग किया क्योंकि जावा से सी ++ में रूपांतरण अधिक प्राकृतिक था, लेकिन यह पूरी तरह से धीमा हो गया था। जावा और देशी के बीच सरणी प्रतिलिपि के साथ सीधे बफर पूरी तरह से पक्षपातपूर्ण प्रदर्शन मुद्दों, और मुझे 6x टक्कर के साथ छोड़ दिया।

इसके अलावा, अपने स्वयं के वेक्टर वर्ग को घुमाने के बजाय, मैंने अभी ईजिन गणित पुस्तकालय का उपयोग किया है। मुझे यकीन नहीं है कि प्रदर्शन पर इसका कितना असर पड़ा है, लेकिन कम से कम, यह मुझे अपने स्वयं के (कम कुशल) वेक्टर वर्ग को समर्पित करने का समय बचाता है।

एक और सबक सीखा है कि अत्यधिक लॉगिंग प्रदर्शन के लिए खराब है (जेआईसी जो स्पष्ट नहीं है)।

उत्तर

4

नहीं वास्तव में अपने प्रश्न के लिए एक सीधा जवाब है, लेकिन निम्न लिंक आप के लिए काम का हो सकता:

दूसरी कड़ी निम्नलिखित लिखा है में:

मूल कोड जावा से अधिक आवश्यक नहीं है। एक बात के लिए, जावा-मूल संक्रमण से जुड़ी लागत है, और जेआईटी इन सीमाओं में अनुकूलित नहीं हो सकता है। यदि आप मूल संसाधनों (मूल ढेर, फ़ाइल वर्णनकर्ता, या जो भी हो) पर स्मृति आवंटित कर रहे हैं, इन संसाधनों के के समय पर संग्रह की व्यवस्था करना अधिक कठिन हो सकता है। आपको प्रत्येक आर्किटेक्चर के लिए अपना कोड संकलित करने की भी आवश्यकता है, जिसे आप चलाने के लिए चाहते हैं (इसके बजाय जेआईटी होने पर भरोसा करें)। तुम भी आप क्या विचार करना एक ही वास्तुकला के लिए एक से अधिक संस्करण संकलित करने के लिए हो सकता है: मूल कोड में हाथ प्रोसेसर के लिए संकलित G1 नेक्सस वन में एआरएम का पूरा लाभ नहीं ले सकते हैं, और कोड एआरएम के लिए संकलित नेक्सस वन में जी 1 में एआरएम पर नहीं चलेगा। आप "तेज" भागों एक जावा अनुप्रयोग के के लिए नहीं एक मौजूदा देशी codebase है कि आप Android के लिए बंदरगाह करना चाहते हैं जब,

मूल निवासी कोड मुख्य रूप से उपयोगी है।

+0

मुझे जेएनआई कॉल के ओवरहेड के बारे में पता है। लेकिन मुझे पता है कि यह अस्तित्व में है, और मुझे यकीन नहीं है कि क्या यह देशी कोड का उपयोग करने से प्राप्त होने वाले किसी भी प्रदर्शन लाभ को अस्वीकार या संभवतः खराब कर देगा। हालांकि, मैं पहले अनुच्छेद के अंतिम भाग के बारे में अधिक उत्सुक हूं। अगर मैं कुछ देशी कोड का उपयोग करता हूं, तो क्या मुझे इसे "विभिन्न आर्किटेक्चर" के लिए संकलित करना होगा? मैं यह भी कैसे शुरू करूंगा कि किस आर्किटेक्चर के लिए मुझे संकलन करने की आवश्यकता होगी? ऐसा नहीं कर रहा है मेरे ऐप में त्रुटियों का कारण बनता है, या यह उतना अनुकूलित नहीं होगा जितना होना चाहिए? – user8709

+1

अंत में, जैसा कि मैंने इस विषय पर शोध किया है, मैं एक दिलचस्प प्रदर्शन परीक्षण में आया हूं जो कि जावा/मूल के इमेक्ट को निश्चित/फ़्लोटिंग पॉइंट अंकगणित के साथ विचार कर रहा था। इन गणनाओं के साथ मूल कोड का उपयोग करने से लाभ एक अच्छा सुधार था। मुझे ये बेंचमार्क प्रासंगिक लगता है क्योंकि जिस कोड को मैं देशी बनाना चाहता हूं वह बहुत अधिक फ़्लोटिंग पॉइंट गणना कर रहा है। http://www.badlogicgames.com/wordpress/?p=71 संपादित करें: यह पहली पीढ़ी के एंड्रॉइड डिवाइस पर अधिक लक्षित हो सकता है। ये डिवाइस हर दिन कम प्रासंगिक होते जा रहे हैं, इसलिए शायद यह आलेख उतना प्रासंगिक नहीं है जितना मैंने सोचा था। – user8709

+0

मैं ईमानदारी से "विभिन्न आर्किटेक्चर के लिए संकलन" भाग के बारे में नहीं जानता, क्योंकि मैं आमतौर पर जेनी का उपयोग नहीं करता हूं। फ्लोटिंग पॉइंट ऑपरेशंस के बारे में, मैंने जो पहला लिंक पोस्ट किया है, उसके पास फ्लोटिंग पॉइंट ऑपरेशंस के बारे में भी एक हिस्सा है: "अंगूठे के नियम के रूप में, फ्लोटिंग-पॉइंट एंड्रॉइड डिवाइस पर पूर्णांक की तुलना में लगभग 2x धीमी है। यह एक एफपीयू-कम पर सच है , जेआईटी-कम जी 1 और एक एफपीयू और जेआईटी के साथ एक नेक्सस वन। (बेशक, उन दो उपकरणों के बीच पूर्ण गति अंतर अंकगणितीय परिचालनों के लिए लगभग 10x है।) " – Jave

1

आप खेल विकास के एक काफी प्रारंभिक चरण में अभी भी कर रहे हैं, तो आप जो एक अच्छी टक्कर पता लगाने तंत्र प्रदान करता है Libgdx जो box2d टक्कर पता लगाने के एक काफी अच्छा काम करता है की तरह एक खेल इंजन के उपयोग पर विचार कर सकते हैं।

+2

यह कई डेवलपर्स के लिए एक अच्छा सुझाव है। मैंने अपने इंजन को दो कारणों से लिखने का फैसला किया: यह 3-आयामी है (एंड्रॉइड गेम इंजनों में से कई सिर्फ 2 डी गेम के लिए हैं), और मुझे यह भी लगता है कि प्रक्रिया एक बड़ी प्रणाली को डिजाइन और विकसित करने में वास्तव में मजेदार है। इंजन इस बिंदु पर काफी हद तक बड़ा है, कोड की 10k + रेखाएं, और डेटा-संचालित कई स्थानों पर। एक बार जब मैं मूल कार्यक्षमता विकसित कर रहा हूं, तो मैं दूसरों के उपयोग के लिए इसे बहुत अच्छी तरह से रिलीज़ कर सकता हूं। – user8709

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