W mojej grze myszy wyglądają i chodzą, ale są one bardzo wolne i trudne w użyciu. Myślę, że to dlatego, że używam stałej prędkości. Słyszałem, że w dużych projektach programiści używają czasu delta. Jak obliczyć czas delta w glut? Jak obliczyć prędkość na podstawie czasu delta?
14
Odpowiedzi:
„Czas delta” to czas, który upłynął między dwiema aktualizacjami ramek (ale można go również wykorzystać w innych kontekstach; jest to zwykle wynik odejmowania czasu).
Czas delty można uzyskać w glut za pomocą metody glutGet i parametru GLUT_ELAPSED_TIME oraz niektórych operacji.
Poniższy wiersz zwraca liczbę milisekund od wywołania glutInit (lub pierwszego wywołania glutGet (GLUT_ELAPSED_TIME)):
Jeśli więc zarejestrujesz bieżący timeSinceStart w każdej pętli renderowania, możesz poznać wartość deltaTime, odejmując starą od nowej.
Możesz to zrobić prawie w ten sam sposób, używając biblioteki ctime C / C ++ z clock () i wyrażeniem stałym makro CLOCKS_PER_SEC, które określa relację między taktowaniem zegara a sekundą.
Zasadniczo możesz użyć deltaTime, aby zaktualizować swoje ruchy w stosunku do tego czasu, który upłynął, zamiast używać stałej wartości czasu. W ten sposób prędkość ruchu twojej postaci powinna być prawie taka sama, jeśli twój program działa przy 60 fps lub jeśli działa przy 10 fps.
Oto mały przykład: załóżmy, że chcesz przesunąć coś o 10 jednostek na sekundę na osi x. Możesz zrobić coś takiego (jeśli deltaTime rzeczywiście używa milisekund).
W ten sposób, bez względu na to, czy Twój program aktualizuje się 2 razy, czy 100 razy, 1 sekundę później pozycja powinna być prawie taka sama, a na grę wpływa mniejszy fps małego komputera niż przy użyciu stałych wartości.
Przy stałych wartościach ==> niskie fps = mniej aktualizacji = powolne ruchy, podczas gdy wysokie fps = więcej aktualizacji = bardzo szybkie ruchy.
Z deltaTime ==> „prawie” te same ruchy.
Na koniec powinieneś przeczytać Krok o stałym czasie vs Zmienny o czasie na gamedev.stackexchange.
źródło
positive int
Zazwyczaj przejść do 2.147.483.647 jeśli podpisane i do 4.294.967.295 jeśli unsigned ... więc nawet jeśli weźmiemy pod uwagę mniejszy, 2.147.483.647 milisekund jest prawie 25 dni ... To powinno być dosyć obsłużyć większość gry timery i nawet jeśli to nie wystarczy, nadal możemy rozsądnie użyćunsigned int
(~ 50 dni) lub nawetlong long
(jak zwykle to robię).QueryPerformanceCounter
w systemie Windows igettimeofday
na większości innych. Będziesz musiał ubrudzić sobie ręce i dążyć do nieco więcej niż najmniej wspólnego mianownika interfejsów API platformy, szczególnie w C i C ++.