Ograniczenie liczby klatek na sekundę

9

Najbardziej udane silniki konkurencyjna gra jak id Tech, GoldSrc, Sourcei takie pozwalają na ograniczenia framerate.

Możesz grać z 30, z 60, z 99, z 72, z 68 itd. Krótko mówiąc, możesz je ograniczyć i kontrolować ten limit.

Zastanawiałem się, jak mogę ograniczyć ilość klatek na sekundę?

Nie interesuje się kodem, ale teorią.

joltmode
źródło
Po prostu z ciekawości, jaki jest sens tego innego niż zwolnienie cykli dla innych procesów?
3Dave
1
@DavidLively, Pomyśl o laptopach, które bardzo łatwo się przegrzewają przy bardzo wysokiej liczbie klatek na sekundę, a przy pułapie 60 klatek na sekundę (więcej jest bezużyteczne, nawet 60 to trochę więcej, 40 powinno zrobić) mogą znacznie lepiej kontrolować temperaturę.
W przypadku gier konkurencyjnych najlepiej jest mieć równomierną liczbę klatek na sekundę zamiast skoków między 60 a 100 klatek na sekundę, ponieważ czasami niektóre akcje zależą od liczby klatek na sekundę i nie zależą od czasu, równa liczba klatek na sekundę pozwala wyczuć te akcje. Przy okazji pamiętaj, że jeśli włączysz VSync, twoja gra zawsze ma maksymalny fps równy twojej częstotliwości odświeżania, ponieważ (kierowca o to dba).
Roy T.

Odpowiedzi:

7

Teoria brzmi: Sprawdź, kiedy ostatnio renderowałeś ramkę, a jeśli nie jest jeszcze czas, aby narysować kolejną ramkę, nie rób tego i poczekaj, aż będzie.

Kylotan
źródło
8

Załóżmy, że chcesz ograniczyć liczbę klatek na sekundę do 60 klatek na sekundę, co oznacza, że ​​każda klatka ma czas renderowania 1 / 60s = 16,67 ms (w zaokrągleniu)

Aby ograniczyć liczbę klatek na sekundę, wystarczy sprawdzić czas na początku pętli gry, a następnie porównać go z czasem na końcu pętli gry: jeśli różnica jest mniejsza niż 16,67 ms, należy zatrzymać się na ten czas.

Jednym ze sposobów na to jest użycie:

sleep(waittime)

Ponieważ jednak sleep(x)daje wątek przez minimum xmilisekundy, nie wiesz na pewno, czy odzyskasz kontrolę w czasie.

Lepszym sposobem byłoby użycie:

while(timediff < 16.67ms){ sleep(0); }

Daje to wątek i zwraca kontrolę jak najszybciej.

Innym rozwiązaniem jest po prostu zajęta pętla oczekiwania, co daje najlepszą kontrolę, ale niepotrzebnie wykorzystuje procesor.

Pamiętaj, że harmonogram systemu operacyjnego może zawsze odebrać kontrolę nad twoim wątkiem, więc przygotuj się na pewne wahania.

Roy T.
źródło
„1/60”, aby być jasnym. :)
Richard Marskell - Drackir
To rozwiązanie jest naprawdę złe. Jeśli masz włączoną funkcję vsync lub system operacyjny zdecyduje się na wykonanie pewnych czynności, liczba klatek na sekundę będzie się bardzo zmieniać.
Tara
@Dudeson Dlaczego jest źle? (jest to technika stosowana w Quake3 btw). Jeśli twój FPS jest niższy niż 60, pętla jest po prostu pomijana. Dzięki temu FPS utrzymuje się na jak najwyższym poziomie, ale nigdy nie przekracza 60.
Roy T.
@RoyT. Ciekawe ... Skąd masz te informacje? Z kodu źródłowego? Mówię też, że czekanie w pętli jest złe, ponieważ tak właśnie zrobiłem w silniku i sprawia mi to wiele bólu. Problem polega na tym, że po włączeniu vsync (w sterowniku GPU) otrzymujesz dużo spadków klatek, jeśli dodatkowo spróbujesz ograniczyć liczbę klatek w kodzie, ponieważ timinig nie będzie idealny dla każdej klatki. Mówię tylko o problemach vsync. Bez vsync nie jest to problemem. I nie jestem pewien, czy vsync był takim samym układem w Quake 3 dni jak dzisiaj.
Tara
@Dudeson ktoś inny wskazał mi to jakiś czas temu, ponieważ martwiłem się o zajęty czekanie i sen. Widzę teraz, że możesz wahać się między 30 klatkami na sekundę a 60 klatkami na sekundę, gdy synchronizacja w pionie jest włączona, jeśli nieco ją przegapisz. Ale wydaje mi się, że dzieje się to z każdą techniką (czy nie to właśnie FreeSync próbuje złagodzić). Myślę, że ograniczona liczba klatek na sekundę według kodu lub ponieważ Twój komputer nie może renderować z prędkością 60 klatek na sekundę, zawsze będzie miał ten problem :)
Roy T.,