2011-02-04 23 views
7

मैं पिछले 6 महीनों से एंड्रॉइड गेम पर काम कर रहा हूं, और यहां कई बार विभिन्न मुद्दों के बारे में पोस्ट किया है जिन्हें मैं छुटकारा नहीं पा सकता हूं।क्या एंड्रॉइड गेम स्टटर-फ्री बनाना असंभव है? मैं यहाँ पागल हो रहा हूं

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

मेरा गेम एक स्क्रॉलिंग गेम है जहां आप लगातार स्क्रीन को ले जाते हैं (एक उड़ान गेम के बारे में सोचते हैं), लेकिन जिस तरह से मैं वर्तमान में हूं लगभग 50-100ms के लिए हर सेकेंड या तो लगातार stuttering में पृष्ठभूमि के परिणाम कर रहे हैं। यह गेम तोड़ना नहीं है, लेकिन यह बहुत विचलित है और गेम को ऐसा लगता है जैसे इसे पूर्ण मूर्खता से प्रोग्राम किया गया था (हालांकि मुझे संदेह है कि यह मामला हो सकता है)।

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

मैं व्यावहारिक रूप से निराशा के साथ अपने बालों को फाड़ रहा हूं। मैंने अकेले पिछले हफ्ते में इस सरल एप्लिकेशन उदाहरण पर अंतराल से छुटकारा पाने की कोशिश में 40 घंटे से अधिक समय व्यतीत किया है और यह मुझे पागल कर रहा है। मेरे द्वारा लिंक किए गए एक के रूप में सरल आवेदन कैसे संभवतः अंतराल के मुद्दों हो सकता है? आपको नहीं लगता कि स्क्रॉलिंग पृष्ठभूमि उस से कहीं अधिक सरल हो सकती है ...

नोट: यह प्रदर्शन लगातार मेरे फोन (एक मोटोरोला मील का पत्थर) पर लगभग 60fps प्राप्त करता है। एफपीएस देखने के लिए उदाहरण में एफपीएस कोड को असम्बद्ध करें।

टीएल; डीआर: असाधारण सरल प्रोग्राम जो सिर्फ एक स्क्रॉलिंग पृष्ठभूमि है, स्टटरिंग दिखाता है। (एक घास क्षेत्र की तरह दिखता है) http://dl.dropbox.com/u/4972001/LunarLander.rar

+0

JetBoy डेमो हकलाना है जब यह पर चलता है आपका फोन? http://developer.android.com/resources/samples/JetBoy/index.html – jhouse

+0

ट्रेसव्यू ने आपको क्या बताया? इसके अलावा, भविष्य में, कृपया लौ-बैट हेडलाइंस को छोड़ दें। – CommonsWare

+0

लौ-चारा के बारे में खेद है, जब मैंने इसे लिखा था तो मैं बहुत निराश था (जैसा कि मुझे यकीन है कि आप बता सकते हैं)। ट्रेव्यूव सामान्य से कुछ भी नहीं दिखाता है। सभी ड्रा/अपडेट भौतिकी कॉल के बीच बराबर अंतराल हैं। ऐसा कुछ ऐसा लगता है जो दृश्यमान है लेकिन मापने योग्य नहीं है, जो भ्रमित है। इसके अलावा, हाँ, जेटबॉय ने भी मुद्दों को रोक दिया है। – Smills

उत्तर

4

मैं अपने स्क्रॉल पृष्ठभूमि के साथ RAR फ़ाइल डाउनलोड किया है, और यह स्थापित: कृपया LunarLander उदाहरण के आधार पर सरल हकलाना उदाहरण डाउनलोड करने के लिए एक नजर है ...

लिंक मेरे मोटोरोला Droid पर।

मैं स्क्रॉल के रूप में कोई स्टटरिंग नहीं देख सकता, मैंने इसे एक मिनट से भी अधिक समय तक देखा है।

आपके विवरण के आधार पर मैं मीलस्टोन हार्डवेयर/प्लेटफ़ॉर्म को कुछ अजीब वीडियो ड्राइंग/टाइमिंग समस्या को दांव दूंगा।

शायद स्पष्टीकरण इस के साथ कुछ है: मील का पत्थर डायल 60 हर्ट्ज पर रीफ्रेश करता है (बस यहां एक नंबर चुनना, मुझे नहीं पता कि यह वास्तव में क्या है), और आपकी फ्रेम दर थोड़ी दूर है - 63 या 57 हर्ट्ज कहें ... क्या यह कल्पना नहीं की जा सकती है कि लगभग एक बार आपके ड्रॉ का समय, और हार्डवेयर डिस्प्ले अपडेट का समय बस इतना ही मेल नहीं खाता है कि पृष्ठभूमि को एक बार फिर से आकर्षित नहीं किया जाता है, और अपने अगले फ्रेम तक इंतजार करना है? और कभी-कभी समय रेखाएं इतनी पर्याप्त होती हैं कि आप पंक्ति में दो या तीन ड्रॉ के समय को याद कर सकते हैं (इस पर निर्भर करता है कि आपका फ्रेम-चक्र वास्तविक स्क्रीन रीफ्रेश चक्र से कितना दूर है)।

संपादित करें: असल में, मैंने इसे एक और मिनट के लिए देखा, मैंने एक बहुत छोटा (केवल समझने योग्य) स्टटर देखा था।

+0

यह वास्तव में मेरे सिद्धांतों में से एक था (रीफ्रेश दर एफपीएस से थोड़ी दूर है), लेकिन मुझे नहीं पता कि इसे कैसे ठीक किया जाए ... क्या आपको लगता है कि इस तरह के किसी मुद्दे को ठीक करने का कोई आसान तरीका होगा? – Smills

+0

ऐसा नहीं है कि मुझे पता है। योर के दिनों में अन्य प्लेटफॉर्म पर गेम कोडिंग के साथ मेरे अनुभव में (उदा। प्लेस्टेशन 1, सेगा सैटर्न इत्यादि) फ्रेम दर को डिस्प्ले ड्राइवर के साथ वास्तव में हार्डवेयर इंटरप्ट हुक प्राप्त करके प्रदर्शन दर में सिंक किया गया था। पता नहीं है कि आप एंड्रॉइड मंच के साथ ऐसा कैसे कर सकते हैं। – jhouse

+0

हम्म, ठीक है, मैंने अपने और एक दोस्त के फोन (नोकिया एन 9 00 एंड्रॉइड 2.2 चलाने) पर स्टटरिंग देखी है। मैं सोच रहा हूं कि यह सिर्फ फोन के एक छोटे समूह को प्रभावित करता है। – Smills

0

क्या आपने न्यूनतम फ्रेम समय के जौस के सुझाव पर विचार किया है?

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

मेरे कोड इस तरह है:

long frameTime; // calculate time to process this frame 

    while (mSurfaceAvailable) { 
     // ensure minimum frame time can be calculated 
     frameTime = SystemClock.uptimeMillis(); 

     // code to move everything and display a single frame goes here 

     // ensure minimum frame time 
     frameTime = SystemClock.uptimeMillis() - frameTime; 
     if (frameTime < 0) frameTime = MIN_FRAME_TIME;  // cope with wrap-around of uptimeMillis 
     if (frameTime < MIN_FRAME_TIME) { 
      /*DEBUG*/Log.v(this.getClass().getName(), "run: Sleeping for "+(MIN_FRAME_TIME - frameTime)+"ms"); 
      try { 
       sleep(MIN_FRAME_TIME - frameTime); 
      } catch (InterruptedException e) { 
       /*DEBUG*/Log.i(this.getClass().getName(), "run: Thread sleep was interrupted (not a problem)"); 
      } 
     } else { 
      if (frameTime != MIN_FRAME_TIME) { 
       /*DEBUG*/Log.v(this.getClass().getName(), "run: System is too slow, by "+(frameTime - MIN_FRAME_TIME)+"ms per frame"); 
      } 
     } 

मैं नींद अपवाद एक मंच से निपटने (! शायद इस एक) मिल गया लेकिन कभी नहीं देखा है अपवाद उत्पन्न

+0

अब यह दिलचस्प है। मैंने आपके उपरोक्त कोड को लागू किया है, अगर मैंने अपना गेम 20ms MIN_FRAME_TIME पर सेट किया है, तो यह इसे 33ms MIN_FRAME_TIME पर सेट करने की तुलना में काफी अधिक अंतराल है। आप विपरीत की अपेक्षा करेंगे ... संपादित करें: यह 16ms MIN_FRAME_TIME के ​​साथ फिर से आसान है।EDIT2: हालांकि, यह अभी भी stutters। हालांकि पहले से कम संभव है। – Smills

+0

अंतराल से आपका क्या मतलब है? MIN_FRAME_TIME जितना धीमा होगा उतना ही बड़ा होगा। मुझे नहीं पता कि लॉगिंग चीजों को कैसे प्रभावित करेगी, इसलिए // DEBUG */// के साथ सभी/* DEBUG *// को बदलने का प्रयास करें। – FrinkTheBrave

1

मैं इस एक ही होने के लिए किया गया है मेरे खेल में अंतराल मुद्दा (और मैंने ऐसा कुछ किया जो आपने लुनरलैंडर लूप से किया था और इसी तरह के निष्कर्ष तक पहुंचा था)। यदि आप लॉगकैट खोलते हैं, तो आप देख सकते हैं कि अंतराल GC_FOR_MALLOC (50 ... 100 एमएस, हमारे लम्बे समय के साथ) के साथ होता है। मुझे संदेह था कि समस्या का स्रोत कचरा कलेक्टर था। तब मैं इस पोस्ट पाया:

http://fanitis.com/2011/02/09/android-game-performance-garbage-collection/

मैं कचरा कलेक्टर के उपयोग को कम करने और अगर मैं एक lagless हालत hehehe प्राप्त देखने के लिए कोशिश करेंगे =]

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