Czytałem, że szybkość obiektów w grze nie powinna być utrudniana przez FPS, ale zamiast tego powinna być oparta na czasie. Jak mogę oddzielić kod aktualizacji / rysowania, aby zmaksymalizować wydajność bez ograniczania szybkości rysowania i zapewnić stałą logiczną szybkość aktualizacji na podstawie czasu?
Mój obecny pseudo kod jest następujący
loop
{
draw();
if (ticksElapsed() > 100)
{
update();
ticks+= ticksElapsed();
}
}
Problem polega na tym, że kod rysunkowy utrudnia wydajność aktualizacji (). I zużywa 100% procesora, ponieważ jeśli zostanie uśpiony, to wyłączy obie funkcje rysowania / logiki.
Używam również SDL i wydaje się, że nie ma opcji vsync. Słyszałem również o terminach ustalonych i zmiennych krokach czasowych, jednak nie jestem pewien, jak można to zrobić za pomocą funkcji sleep ()
sdl
frame-rate
logic
fixed-timestep
Oskenso Kashi
źródło
źródło
Odpowiedzi:
We fragmencie kodu wygląda to tak, jakbyś próbował uruchomić grę w trybie krokowym w ustalonym czasie, czekając na zajęcie, jeśli rysunek i aktualizacja zajęły mniej niż 15 ms (60 klatek na sekundę). Jest to możliwe i dobrze zgadłeś, że nie można tego zrobić za pomocą połączenia snu, ponieważ nie wiesz dokładnie, jak długo będziesz spać. Pętla oczekiwania na zajęty jest dobrym rozwiązaniem.
Jednak rozważ przypadek, w którym aktualizacja i rysunek przekraczają 15 ms, teraz gra jest rysowana i aktualizowana w zwolnionym tempie. Możesz teraz zrobić dwie rzeczy: wykryć ten stan i upuścić klatki (pomiń rysowanie i przejdź od razu do aktualizacji, dopóki nie zsynchronizujesz ponownie), ale jeśli komputer jest po prostu spowolniony, nigdy go nie dogoni.
Innym rozwiązaniem jest uniezależnienie logiki aktualizacji od czasu. Nie potrzebujesz do tego osobnego wątku, musisz tylko określić, jak szybko powinno się poruszać. Zamiast 5 pikseli na tik należy użyć 50 pikseli na sekundę. Aby to osiągnąć, potrzebujesz precyzyjnego timera, a cała logika aktualizacji powinna mieć dostęp do timera, aby zobaczyć, ile czasu minęło od ostatniej aktualizacji.
Zasadniczo odchodzisz od:
Do
źródło