#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]