Po ponownym przeczytaniu Twojego pytania, myślę, że lewę, której nam brakuje (na podstawie komentarza, że działanie w systemie o wyższym poziomie odświeżania spowoduje, że logika gry będzie działała szybciej), polega na tym, że skalujesz swoje aktualizacje na podstawie w czasie "delta", który jest przekazywany do renderowania. Andrei Bârsan wspomniał o tym powyżej, ale pomyślałem, że nieco rozwinąłem kwestię wykorzystania delty.
Na przykład w renderowaniu mojej gry(), najpierw nazywam moją entityUpdate (delta), która aktualizuje i przesuwa wszystkie obiekty w mojej grze skalowane o odległość przebytą w czasie "delta" (nie renderuje one, po prostu przesuwają swoje zmienne pozycji). Następnie wywołuję entityManageCollisions (delta), która rozwiązuje wszystkie kolizje spowodowane przez aktualizację, a następnie w końcu wywołuje entityDraw (batch, delta), która używa delty, aby uzyskać odpowiednie ramki dla animacji ikonek i faktycznie rysuje wszystko na ekranie.
Używam wariantu Entity/Componet/System, więc obsługuję wszystkie moje podmioty w sposób ogólny, a te wywołania metod, o których wspomnę powyżej, są zasadniczo "systemami" działającymi na jednostkach z pewnymi kombinacjami komponentów na nich.
Wszystko, co powiem, przekazać delta (parametr przekazany do render()) do całej logiki, aby można skalować rzeczy (przenieść encje o odpowiednią odległość) w oparciu o czas, który upłynął od ostatnie połączenie. Wymaga to ustawienia prędkości w oparciu o jednostki/sekundę dla twoich jednostek, ponieważ podajesz wartość, aby je skalować, o ułamek sekundy. Gdy zrobisz to kilka razy i poeksperymentujesz z wynikami, będziesz w dobrej formie.
Uwaga: spowoduje to, że staniesz się szalony podczas interaktywnych sesji debugowania, ponieważ zegar delta gromadzi czas od ostatniego wywołania renderowania, co powoduje, że twoje jednostki latają na całym ekranie (i poza nim - sprawdzają dla ciebie te granice!), ponieważ generalnie uzyskują pod-sekundowe aktualizacje, ale mogą skończyć mijając 30 sekund (lub jak długo spędzisz patrząc na rzeczy przechodzące przez debugger), więc na samej górze mojego render(), mam linię, która mówi delta = 0.016036086f;
(ten numer był detla próbki z mojej stacji roboczej dev i wydaje się dawać przyzwoite wyniki - można uchwycić typową deltę systemu wideo, zapisując ją na konsoli podczas testu, i użyć tej wartości zamiast tego, jeśli like), które komentuję, aby kompilacje zostały wdrożone, ale pozostawiają nie komentowane podczas debugowania, więc każda klatka przesuwa grę do przodu o stałą ilość, niezależnie od tego, ile czasu spędzam patrząc na rzeczy w debugerze.
Powodzenia!
Oto wspaniały artykuł: http://www.koonsolo.com/news/dewitters-gameloop/ – nullpotent