एक Pygame कार्यक्रम में अजीब अंतराल

मैं pygame में एक छोटा सा खेल चला रहा हूं जिसके लिए मुझे मुख्य लूप के प्रत्येक पुनरावृत्ति के बीच लगातार देरी की आवश्यकता है। Altough मैंने FPS count को 60 पर pygame.Clock.tick_busy_loop() से लॉक कर दिया है, मैं देरी में एक भिन्नता (लगभग 4 मिलीसेकंड प्रति लूप) देखता हूं। मेरे फ़ंक्शन में से एक को बग किया जाना चाहिए, लेकिन मुझे कौन सी समस्याएं मिल रही हैं।

मैंने Ipython के साथ अपने मुख्य पाश पर% prun का उपयोग किया, और ये परिणाम हैं:

         2264 function calls in 5.439 seconds

   Ordered by: internal time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
      322    4.401    0.014    4.401    0.014 {method 'tick' of 'Clock' objects}
      322    0.730    0.002    0.730    0.002 {pygame.display.flip}
        1    0.228    0.228    0.228    0.228 {pygame.base.quit}
        1    0.034    0.034    0.034    0.034 {method 'blit' of 'pygame.Surface' objects}
        1    0.028    0.028    5.439    5.439 main.py:9(main)
      323    0.014    0.000    0.014    0.000 {pygame.event.get}
      323    0.002    0.000    0.016    0.000 lib.py:26(getInput)
      322    0.001    0.000    0.036    0.000 lib.py:80(checkEventType)
      322    0.001    0.000    0.035    0.000 lib.py:91(instructions)
      322    0.000    0.000    0.000    0.000 {method 'get_time' of 'Clock' objects}
        1    0.000    0.000    5.439    5.439 :1()
        1    0.000    0.000    0.000    0.000 {pygame.mixer.stop}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
        2    0.000    0.000    0.000    0.000 {ord}

क्या यहां कुछ ऐसा है जो प्रत्येक पुनरावृत्ति के बीच देरी में 2-5 मिलीसेकंद परिवर्तन को समझा सकता है?

1
अधिक विस्तृत आउटपुट प्राप्त करने के लिए कमांड लाइन से cProfile का उपयोग करके प्रारंभ करें: stackoverflow.com/a/7693928/1156707
जोड़ा लेखक blz, स्रोत
यह सिर्फ एक कार्यान्वयन विस्तार हो सकता है। tick_busy_loop के लिए प्रलेखन कहता है, "फ़ंक्शन प्रति सेकंड दिए गए टिकों की तुलना में धीमी गति से चलने के लिए देरी करेगा।" इस बात की कोई गारंटी नहीं है कि यह प्रति सेकंड प्रति सेकंड टिक के करीब होगा; पायगम आपको 5 एफपीएस तक धीमा कर सकता है और अभी भी अपना वादा रख सकता है।
जोड़ा लेखक Kevin, स्रोत

2 उत्तर

आपका प्रोग्राम कंप्यूटर पर एकमात्र कार्यक्रम नहीं है। सिस्टम को एक ही समय में अन्य कार्यक्रम चलाने के लिए है। कभी-कभी यह तेजी से किया जाता है, कभी-कभी धीमा। चिंता करने के लिए 2-5 एमएस बहुत कम है।

1
जोड़ा

आप संभवतः pygame.time.Clock.tick() को pygame.Clock.tick_busy_loop() के बजाय उपयोग करना चाहते हैं:

http://www.pygame.org/docs/ref /time.html#pygame.time.Clock.tick

ध्यान दें कि यह फ़ंक्शन SDL_Delay फ़ंक्शन का उपयोग करता है जो प्रत्येक प्लेटफ़ॉर्म पर सटीक नहीं है, लेकिन अधिक सीपीयू का उपयोग नहीं करता है। यदि आप एक सटीक टाइमर चाहते हैं, तो tick_busy_loop का उपयोग करें, और चबाने वाली सीपीयू को ध्यान में रखें।

बेशक, आप 60 पर framerate रखने के बारे में बहुत सख्त हैं।

1
जोड़ा