Tak, można to zrobić w jednym wątku. Ogólnie rzecz biorąc, będziesz chciał aktualizować obiekty co klatkę, a nie tylko wtedy, gdy są wolne cykle. Twoje animacje i ruch zostaną odłączone od liczby klatek na sekundę, a jeśli nie, będą wyglądać raczej niepewnie. Jeśli mówisz więcej o aktualizacjach AI lub czymś innym, co nie musi być w czasie rzeczywistym, postawiłbym na tym czas. Powinieneś wiedzieć, jaka jest docelowa liczba klatek na sekundę, a czas bezczynności będzie taki, jaki pozostanie po zakończeniu wszystkich innych czynności.
Załóżmy, że celujesz w 60 FPS w swojej grze. Dzięki temu masz 16,667 ms na wykonanie wszystkich prac potrzebnych do wykonania każdej klatki. Na początku gry uzyskaj aktualny czas przy użyciu timera o najwyższej dostępnej rozdzielczości, dodaj 16,667 ms i zapisz go gdzieś. Myślę, że funkcją w pythonie jest time (), chociaż minęło trochę czasu, odkąd pracowałem w tym języku. Po zakończeniu przetwarzania wprowadź pętlę, która porównuje bieżącą godzinę z czasem zarejestrowanym. Jeśli bieżący czas jest krótszy niż czas zakończenia ramki, update_a_very_small_amount. Nie martwiłbym się zbytnio przetwarzaniem przechodzącym do końca ramki, ponieważ twoja mała aktualizacja powinna być szybka do przetworzenia. Byłoby to tylko niewielkie opóźnienie do rozpoczęcia następnej klatki i wydaje się, że masz wystarczająco dużo czasu bezczynności, aby sobie z tym poradzić.
Po zakończeniu przetwarzania ramki dodaj 16,667 ms do czasu, który był przechowywany dla końca ostatniej ramki, aby dowiedzieć się, gdzie powinien być koniec następnej ramki. Jeśli użyjesz bieżącego czasu + 16,667 ms, a przetwarzanie się skończy, koniec następnej ramki zostanie wypchnięty o ile czasu minęła ostatnia ramka.
Odp: Druga edycja
Aby to wyjaśnić, używam tutaj terminu liczba klatek na sekundę, aby wskazać jedną iterację przez główną pętlę. Jeśli jest to oparte na prędkości wejściowej użytkownika, wyobrażam sobie, że Twoim celem jest po prostu sprawienie, aby gra była responsywna. W przeciwnym razie możesz po prostu sprawdzić dane wejściowe i zaktualizować wszystko za każdym razem przez pętlę, nawet jeśli zajmuje to 10 sekund. Aby jednak czuł się responsywny, prawdopodobnie będziesz chciał sprawdzić dane wejściowe około 20 razy na sekundę, co daje efektywną szybkość klatek wynoszącą 20 klatek na sekundę, nawet jeśli tak naprawdę nie rysujesz tych klatek. To da ci 50 ms na aktualizację, zanim będziesz musiał ponownie sprawdzić dane wejściowe.