Почему мой код продолжает обновляться с частотой обновления, равной 2 (также как я могу эффективно ограничить частоту кадров)

#python #python-3.x #game-engine

Вопрос:

Итак, это определенно неподходящий язык программирования для этого, но для развлечения я пытаюсь написать 2D-игровой движок на основе python. Прямо сейчас я работаю над ограничением дельта — времени и частоты кадров. Я легко сократил время дельты, но застрял на ограничении кадров в секунду. Я думаю, что моя проблема может быть вызвана тем фактом, что мой код, похоже, работает естественным образом с частотой обновления 2. обычно близко к 64 или 32.

Вот ОЧЕНЬ урезанный пример проблемы. Хотя и урезанный, весь этот код совпадает с тем, что отображается в моем игровом движке (за исключением команд печати).

 import time  previousTime = time.time() time.sleep(0.00001) dT = 0  #for loop in place of the normal while loop  for x in range(3):  #Frame Number   print(x)  #Determine Current Frame Time   now = time.time()  #Determine Delta Time   dT = now - previousTime  #Print All Values for Debug   print('now '   str(now))  print('p time '   str(previousTime))  print('dT '   str(dT))  #Save Previous Time   previousTime = now  #Find Difference Between Time it Took the Previous Frame and the Target Time (.016 seconds is the time a frame should take at 60fps)   frameTimingDif = 0.016 - dT  #Print more values for debug   print('time dif '   str(frameTimingDif))  #Howdy partner, love ya for reading all this ;)  print('FPS '   str(1/dT))  #attempt to sleep for the remaining time to get down to 60fps (if it fails, usually because of framingTimingDif being a negative number)   try:  time.sleep(frameTimingDif)  except:  print('woops')  

Вот результат:

 0 now 1634974666.2838764 p time 1634974666.2682076 dT 0.015668869018554688 time dif 0.00033113098144531283 FPS 63.820815581253804 1 now 1634974666.2995417 p time 1634974666.2838764 dT 0.015665292739868164 time dif 0.00033470726013183627 FPS 63.83538543489841 2 now 1634974666.3151739 p time 1634974666.2995417 dT 0.015632152557373047 time dif 0.00036784744262695346 FPS 63.97071652990879 [Finished in 156ms]  

SOOO long story, not so short, I’m wondering why my python is running in refresh rates of powers of 2 and if there is a way to do frame limiting better.

Big thanks in advance for any answers, friends.

p.s. If you put a time.sleep(0.000001) at the begining of the loop then you get an example of the 32 fps return.

 0 now 1634976028.433253 p time 1634976028.4020138 dT 0.03123927116394043 time dif -0.01523927116394043 FPS 32.01099010127684 woops 1 now 1634976028.4489527 p time 1634976028.433253 dT 0.01569962501525879 time dif 0.00030037498474121127 FPS 63.6957888502483 2 now 1634976028.4801967 p time 1634976028.4489527 dT 0.03124403953552246 time dif -0.01524403953552246 FPS 32.006104680000306 woops [Finished in 156ms]