Obecnie piszę grę przy użyciu C ++ i SDL2 i zastanawiam się nad jedną rzeczą - czy ma sens ograniczanie liczby klatek na sekundę (FPS) i / lub moich aktualizacji na sekundę (UPS)?
Rozumiem, że jeśli ograniczysz UPS, w zasadzie kontrolujesz szybkość gry - jeśli gracz porusza się 1px na aktualizację i zawsze aktualizujesz ją 30 razy na sekundę, porusza się z prędkością 30px / s, a ty Prawdopodobnie też zwolnię procesor, ponieważ zmniejsza się ilość obliczeń na sekundę. Jeśli ograniczysz liczbę klatek na sekundę, liczba przeciągnięć na sekundę zmniejsza się, dlatego odciążasz swój procesor graficzny. Mam nadzieję, że wszystko zrozumiałem poprawnie, jeśli nie, popraw mnie.
Moje pytanie brzmi - co mam ograniczyć w mojej grze? FPS? UPS? Obie? Ani? Czy istnieje inne, lepsze podejście do tego? Jak to się robi w większości gier i dlaczego?
Odpowiedzi są mile widziane!
Odpowiedzi:
Tak, to ma sens.
Jak powiedziałeś, zmniejszy to obciążenie systemu, co jest dobre dla termiki i innych zastosowań.
Jednak .... Twoja logika gier NIE powinna zależeć od aktualizacji na sekundę. Dlatego polecam przyjrzeć się deltatime, który uniezależni twoją grę od aktualizacji na sekundę.
Polecam przyjrzeć się temu pytaniu. Wyjaśnia całkiem dobrze, jak go obliczyć i używać. Jak zdobyć i wykorzystać czas delta
Mam nadzieję, że to pomogło!
źródło
Najlepsza odpowiedź brzmi: to zależy .
Nie musisz ograniczać żadnego z nich
Aktualizacje : Jeśli twoje aktualizacje nie są ograniczone do górnego limitu, logika gry powinna zależeć od czasu delta , aby uniknąć szybszego lub wolniejszego uruchamiania gry w zależności od komputera, na którym jest uruchomiona. Jest to bardzo popularne podejście stosowane w wielu grach, ale nie tylko.
Renderowanie : jeśli renderowanie nie jest ograniczone do górnej granicy, bufor ramki może być prezentowany w stanie niekompletnym lub błędnym, powodując artefakty rozdzierania . Właśnie dlatego wiele gier wykorzystuje synchronizację pionową (v-sync)
Możesz ograniczyć jedno i drugie
Aktualizacje : Niektóre gry wykorzystują ustalone czasy dla niektórych lub wszystkich swoich systemów rozgrywki. To podejście działa tak, jak opisano. Liczba aktualizacji na sekundę jest ograniczona do górnej granicy, aby zapewnić, że rzeczy nie poruszają się zbyt szybko na najwyższym poziomie. Eliminuje to potrzebę synchronizacji delta. Niektóre aplikacje są lepsze ze stałymi krokami czasowymi, niektóre z czasem delta. Wybór podejścia zależy całkowicie od tego, co dokładnie próbujesz osiągnąć. Książka online GameProgrammingPatterns zawiera rozdział poświęcony pętlom gry, które dotyczą obu architektur.
Renderowanie : Liczba klatek na sekundę powinna być ustawiona na górną granicę, aby uniknąć wyżej wspomnianego problemu z rozrywaniem, jednak aplikacja nie powinna próbować tego robić ręcznie z pewną blokadą procesora. Zamiast tego włącz synchronizację pionową i pozwól, aby sprzęt podkładowy zsynchronizował się z częstotliwością odświeżania monitora. W ten sposób twoja gra będzie kompatybilna z przyszłymi monitorami, które mogą działać na znacznie wyższej częstotliwości niż obecnie powszechne 60 Hz. Warto również zauważyć, że wielu graczy, szczególnie tych, którzy biorą udział w testach porównawczych, nadal woli biegać bez synchronizacji pionowej, aby umożliwić najwyższą możliwą częstotliwość klatek. Dlatego rozsądnie jest zezwolić na włączenie lub wyłączenie tej funkcji w czasie wykonywania.
Czego nie powinieneś ograniczać
Jeśli gra wykorzystuje podejście oparte na sondowaniu do wprowadzania danych przez użytkownika, np .: wywołuje pewnego
getInput()
rodzaju aktualizację stanów kontrolera podczas etapu aktualizacji, jest to lepsze, jeśli nie ograniczone. Lub jeśli jest ograniczony, ustaw bardzo wysoką górną granicę. Im częściej pytasz o dane wejściowe użytkownika i reagujesz na nie, tym bardziej responsywna i płynna będzie gra. Tak zwane gry 60 Hz, o których dziś słyszymy, nie aktualizują AI i wszystkich stanów świata w tym tempie, niektóre nawet nie renderują tak szybko, ale sprawdzają dane wejściowe kontrolera co najmniej 60 razy na sekundę i odpowiednio aktualizują awatar gracza. To prawda, że dotyczy to tylko szybkich gier akcji.źródło
Są dwa posty, które możesz chcieć obejrzeć:
Napraw swój Timestep
Interpolowane renderowanie fizyki
Uważam, że dyskusje na temat postów są naprawdę bezcenne, ale moim zdaniem najbardziej sensowne jest, gdy w grze jest znaczna ilość symulacji fizyki. Podsumowując, chodzi o to, że symulacja powinna mieć ustalony krok czasowy (w przeciwnym razie fizyka może eksplodować w punkcie, w którym delta jest zbyt duża), podczas gdy rendering powinien mieć swobodę działania z maksymalną możliwą szybkością. Aby zsynchronizować oba elementy (symulację i rendering), stan renderowania jest interpolowany przez czynnik, który zależy od odległości symulacji od następnej aktualizacji (pamiętaj, że symulacja jest stała).
Mam nadzieję, że to pomoże.
źródło