Czy oddzielny wątek dotyczący pętli gier jest obowiązkowy w przypadku prostych gier?

10

Jestem nowy w tworzeniu gier. Aby się nauczyć, odtwarzam grę na platformie Android. Możesz obejrzeć wideo z gry pod powyższym linkiem. To prosta gra.

Przeczytałem wiele artykułów na temat rozpoczynania tworzenia gier, prawie wszystkie z nich polecają użycie pętli do gier w osobnym wątku, co ma sens w przypadku innych gier. Czy jednak w tej konkretnej grze muszę rozpocząć osobny wątek?

Jin
źródło
Nie jestem pewien, czy to duplikat, ponieważ dotyczy Androida. Istnieją inne rozważania dotyczące wątków na platformie Java, które różnią się od tego pytania.
Sean Middleditch

Odpowiedzi:

8

Pętla gry jest ogólnie zalecana, ponieważ jest prosta . Prawie każdą grę można poprawnie opracować i uruchomić za pomocą pętli, a większość gier wymaga prawidłowego działania.

Na przykład większość silników fizyki wymaga niezawodnych ciągłych aktualizacji dla właściwej symulacji. Animacje i inne dynamiczne treści i grafiki muszą być aktualizowane przy każdej zmianie itp. Coś, co można uzyskać praktycznie za darmo za pomocą pętli.

Teraz pamiętaj, że twoja pętla nie musi działać w osobnym wątku. W rzeczywistości większość gier uruchamia pętlę w głównym wątku dla uproszczenia. Nawet moje projekty na Androida są zgodne z tą zasadą.

Teraz prawdziwe pytanie o to, co alternatywa czy ty proponujesz? Jeśli masz inny pomysł na to, jak niezawodnie uzyskać dane wejściowe, wykonaj aktualizacje i narysuj ramki, które działają dla Ciebie, śmiało! W przeciwnym razie pętla gry może być najłatwiejszym sposobem na rozpoczęcie pracy.


źródło
Myślę, że alternatywą jest aktualizacja ekranu za pomocą samego głównego wątku, ponieważ wszystkie akcje są w szeregu - gracz przesuwa palcami po kulach tego samego koloru, a następnie wszystkie dotknięte kule znikają, pozostałe kulki spadają pod wpływem grawitacji wraz z piłkami zastępczymi.
jin
Więc nie pytasz, czy wymagana jest pętla? Twoim głównym problemem jest to, czy musi on znajdować się w osobnym wątku, prawda?
AturSams,
1
poprawny. moje pytanie dotyczy wątku, a nie pętli. w przypadku tak prostej gry (chociaż będę mieć szczęście, że uda mi się stworzyć taką grę), czy muszę utworzyć nowy wątek, czy wszystko można zrobić w głównym wątku?
jin
1
Nie, to nie jest konieczne. Jeśli masz pętlę , nie ma potrzeby tworzenia drugiej pętli .
@ jin powinieneś naprawdę zmienić tytuł i sposób pisania swojego pytania.
Vallentin
5

Nie , oddzielny wątek nie jest wymagany. Jeśli nie robisz nic zbyt intensywnego (co nie wygląda tak w pokazanej nam grze), wszystko można zrobić w głównym wątku.

Drugi wątek jest wymagany, jeśli wykonujesz dużo przetwarzania lub w inny sposób występują problemy z brakiem odpowiedzi interfejsu użytkownika / danych wejściowych. Na przykład w bardziej złożonych grach nie chcesz, aby interfejs / wejście przestało odpowiadać, gdy AI oblicza swój następny ruch. Ponieważ wydaje się, że twoja gra reaguje przede wszystkim na dane wprowadzane przez użytkowników i aktualizuje elementy graficzne, drugi wątek nie jest wymagany.


Odpowiedź na oryginalne pytanie „Czy wymagana jest pętla”.

Nie , ale alternatywy są bardziej skomplikowane, trudniejsze do wdrożenia i rzadko stosowane.

Gry są z definicji interaktywne. Przynajmniej czeka na wejście i aktualizację danych wyjściowych. Najprostszym sposobem na to jest użycie pętli. Odrodzenie nowego wątku nie jest wymagane.

Chociaż wspomniana gra wydaje się prosta, ma interaktywne efekty wizualne i dźwiękowe i stale aktualizuje te w oparciu o opinie użytkowników.

Nie ma też wielu alternatyw dla pętli gry. Możliwy jest pewien rodzaj systemu opartego na przerwie. Jednak takie systemy zwiększają złożoność i redukują inne czynniki, takie jak determinizm. Istnieje powód, dla którego pętle gier są tak powszechne, że są łatwe do wdrożenia, łatwe do zrozumienia, elastyczne i wykonują świetną robotę.

MichaelHouse
źródło
Jedynym momentem, w którym spotkałem się z przerwaniami na niższym poziomie, było wykonanie określonego zadania sprzętowego i wymaganie powiadomienia procesora / systemu operacyjnego, aby mogli go poprawnie przetworzyć (odczyt danych z dysku do pamięci, a następnie powiadomienie, że jest gotowy, abyśmy mogli powrócić kontrola nad aplikacją i umożliwienie jej przetworzenia), więc nie wiem, co masz na myśli, i po prostu źle ją zinterpretowałem.
AturSams
2

Odpowiedz na aktualne pytanie (czy pętla gry musi znajdować się w osobnym wątku):

Ludzie często zalecają używanie osobnego wątku, ponieważ nie chcą, aby intensywne przetwarzanie zakłócało interaktywność interfejsu użytkownika. Tylko ty możesz stwierdzić, czy twoja gra wymaga osobnego wątku . To zależy całkowicie od silnika i frameworka, czy główna pętla gry w twoim obecnym projekcie może zakłócać czas reakcji interfejsu użytkownika. Myślałem, że ogólnie zakładasz, że tak nie będzie (w małych projektach), chyba że masz powód, by myśleć inaczej.

Innym powodem, dla którego kod należy przechowywać w osobnych wątkach, jest utrzymanie jego modułowości i prostoty. Wymieszanie dwóch niepowiązanych fragmentów kodu może często powodować, że kod stanie się mniej czytelny i łatwiejszy do utrzymania na dłuższą metę.

Czy pętla gry musi działać w osobnym wątku? Możliwie. Jeśli występuje problem z czasem odpowiedzi lub kodem i potrzebujesz wielu elementów interfejsu użytkownika, aby odpowiedzieć niezależnie od intensywnego przetwarzania, lub po prostu chcesz podzielić kod na określone zadania, które występują jednocześnie ze względów projektowych, idź z nim. Jest to jednak uważane za zaawansowaną praktykę programowania.

Prostym, ale może nie doskonałym przykładem do zilustrowania jest gra dla dwóch graczy. Możesz uruchomić dwie instancje klasy, która obsługuje dane wejściowe użytkownika i konwertuje na zmiany stanu w instancji postaci gracza.

Niektóre frameworki zachęcają / wymagają użycia systemu opartego na zdarzeniach / przerwaniach, tak jak robi to ActionScript3.0. W takim przypadku kod pętli zwykle przechodzi do OnEnterFramezdarzenia lub czegoś podobnego, co występuje 20–60 lub 120 razy na sekundę.


Odpowiedz na oryginalne pytanie (czy potrzebuję głównej pętli):

Wszystko sprowadza się do licznika programu . Jeśli tworzysz grę, która będzie działać dłużej niż z góry określony czas i nie będzie generować kodu w miarę upływu czasu, będziesz musiał uprzejmie poprosić komputer użytkownika o powtórzenie instrukcji, które już przetworzył i co może się zmienić w tymczasem jest stan (wartości przechowywane w obiektach i globach gry).

Ponieważ wiesz, że będziesz musiał powtórzyć instrukcje, istnieje kilka sposobów wykonania tego zadania i ciągłego przetwarzania tych samych instrukcji. Wszystkie te metody obejmują przeniesienie licznika programu z powrotem do aktualnie odpowiedniej instrukcji. Najczęstsze instrukcje przepływu sterowania, które powodują powtarzanie kodu, nazywane są pętlami, innym jest gotoinstrukcja, która jest rzadko używana w nowoczesnym kodzie i ma podobny efekt w tym przypadku (całkowicie nieistotny dla Ciebie).

Aby odpowiedzieć na poprzednie pytanie, potrzebujesz pętli? Tak

AturSams
źródło
1
O ile mi wiadomo, frameworki oparte na zdarzeniach, takie jak AS3, nadal mają uruchomioną pętlę gry. Mówię o przerwaniach niższego poziomu, a nie frameworku, który implementuje system zdarzeń.
MichaelHouse
Hmm .. Nie sądzę, że ludzie często używają przerwań niższego poziomu w grach. AFAIK są używane głównie przez CPU do monitorowania operacji IO. Myślałem o abstrakcji wyższego poziomu jako praktyce projektowej, w której reagujesz na dane wejściowe użytkownika lub działania sprzętowe (bez odpytywania), zamiast uruchamiać kilka instrukcji w każdej ramce, a następnie powiedzieć HW, aby wyrenderował wynik.
AturSams,
1
Tak, ludzie już często z nich nie korzystają. Jak powiedziałem, są trudniejsze w użyciu i mamy teraz znacznie lepsze sposoby robienia rzeczy. Rozumiem, co mówisz, i z pewnością jest to inny sposób myślenia o rzeczach, ale tylko na pozór wygląda inaczej, pod tym samym rodzajem pętli.
MichaelHouse
Zgadzam się z @ Byte56, sprowadza się to do pętli, chyba że mówimy o zdarzeniach na poziomie jądra, które używają przerwań IO.
concept3d
1
Wiem o tym, ale większość wszystkiego, co robimy, jest taka sama pod powierzchnią (jak powiedziałem, zmieniając wartość licznika programu). To nie jest tajemnica i wskazałem to w odpowiedzi. Programowanie oparte na zdarzeniach jest pozornie różne, ponieważ przenosimy licznik programu do różnych funkcji, gdy występują różne zdarzenia. Oczywiście istnieje możliwość odpytywania w pętli, aby sprawdzić, czy te zdarzenia ostatnio miały miejsce, ale jako zasada projektowania wydaje się, że jest inna.
AturSams,
0

Aby dodać tutaj odpowiedzi innych osób, coś, o czym nikt wyraźnie nie wspomniał: jeśli podejmiesz ryzyko, że uruchomisz pętlę gry w drugim wątku i przestanie ona odpowiadać, ryzykujesz zamknięcie aplikacji przez system operacyjny. Dlatego zaleca się stosowanie osobnego wątku. Stąd (na przykład) NDK native_app_glue.c/ .hspawnuje oddzielny wątek dla twojej pętli.

Inżynier
źródło