Jak napisać główną pętlę gry? [Zamknięte]

130

Jak napisać główną pętlę gry? Jakie rzeczy powinieneś robić w pętli gry i jakich rzeczy nie powinieneś robić w pętli gry?

Napisałem ich dużo, ale tak naprawdę nigdy nie czytałem na temat pętli gry. Jestem pewien, że mógłbym je znacznie poprawić, ale nie jestem pewien, jak to zrobić.

hokiecsgrad
źródło
4
Zła odpowiedź: co powiesz na użycie czyjegoś silnika, aby stworzyć dla ciebie tę pętlę? :)
user712092
możesz zapytać użytkownika o całkowitą liczbę ramek, które chce uruchomić, i użyć pętli for do n-krotności liczby buforów.
Uğur Gümüşhan

Odpowiedzi:

121

Główna pętla gry obsługuje trzy główne zadania:

  1. Uzyskaj wkład użytkownika
  2. Zaktualizuj stan gry
  3. Narysuj grę

Prosta pętla gry po prostu łączy te trzy zadania w jedną pętlę while. Ma to niepożądane skutki:

  1. Gra działa z różnymi prędkościami na różnych komputerach.
  2. Procesor (może być niepotrzebnie) ustalony na 100% wykorzystania.
  3. Brakuje „stanów gry” / menu lub są one pomieszane z kodem gry.
  4. Główna pętla gry jest bardzo długa i trudna do utrzymania.
  5. Kod jest trudny do rozszerzenia / przeniesienia na inne platformy.

Zaawansowane pętle do gry rozwiązują powyższe problemy. Oto kilka przydatnych artykułów:

Aby uzyskać doskonałą przykładową pętlę gry, zapoznaj się z wersją demonstracyjną łyżwiarki Allegro:

  • Kod pętli gry znajduje się w frameworku . C.
  • Przeglądaj pełny kod źródłowy tutaj .

Pętle gier często wykonują ten sam rodzaj pracy w przypadku większości gier, dlatego zastanawiałem się nad sposobem stworzenia uogólnionego środowiska gry. Lepiej napisać jedną implementację pętli gry i udostępnić ją między grami. Oszczędza to pracę podczas tworzenia nowej gry, a ulepszenia w wspólnej pętli gier mogą być wspólne dla wszystkich gier (na przykład dodanie licznika FPS lub funkcji przechwytywania ekranu).

Leftium
źródło
1
Tak, jak podejrzewam, zdecydowanie mogę wprowadzić ulepszenia. Dobra lektura. Dziękujemy również za opublikowanie kodu. Dzięki tym rzeczom świetnie jest zobaczyć rzeczywisty kod gry.
hokiecsgrad
1
Procesor powinien utknąć przy 100% obciążeniu (lub więcej, np. 50%, jeśli masz co najmniej 2 rdzenie). Pomyśl o tym. Jak zamierzasz uzyskać najnowocześniejszą fizykę, zabójczą grafikę, jeśli siedzisz tam i mówisz sobie: „Och, ale nie chcę używać całego procesora”. Tak, jeśli to możliwe, powinieneś użyć 100% procesora (co oznacza jednak wielowątkowość na dzisiejszych komputerach, więc bardzo trudno jest używać 100% 4 rdzeni przez cały czas). Wykorzystaj w pełni maszynę, na której pracujesz, na tyle, na ile możesz.
bobobobo
5
Pozwól mi dołączyć: dla programów komputerowych . Na urządzeniu przenośnym spalisz znacznie więcej baterii, więc martwisz się o 100% zużycie.
bobobobo
1
@ user6003859: Naprawiłem link.
Leftium
1
kolejny przydatny link: gameprogrammingpatterns.com/game-loop.html
brita_
51

Poleciłbym artykuł Glenna Fiedlera na temat solidnej niezależności klatek, „ Fix Your Timestep!

(Mniej odpowiedni do omawianego tematu, ale pozostałe artykuły z serii są również całkiem dobre - podobnie jak wszystko na jego stronie!)

Neverender
źródło
To zdecydowanie kilka naprawdę dobrych artykułów. Dzięki za opublikowanie!
hokiecsgrad
1
Popieram zalecenie dotyczące solidnej niezależnej implementacji klatek na sekundę. Wszystko w twojej grze powinno być implementowane jako wartość delta, którą okresowo aktualizujesz. I nie należy tego koniecznie robić w tym samym czasie, gdy przechodzisz do następnej klatki. W rzeczywistości, jeśli pominąłeś ramkę, prawdopodobnie naprawdę nie chcesz po prostu wywoływać metod aktualizacji z 2x deltą. Bardziej spójne byłoby wywołanie aktualizacji dwa razy z tą samą różnicą. Zdecydowanie poświęć trochę czasu na poznanie problemów z liczbą klatek na sekundę i cyklem aktualizacji. Zaoszczędzi ci to później.
Dennis Munsie