Jestem nowy w tworzeniu gier. Aby się nauczyć, odtwarzam tę 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?
Odpowiedzi:
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
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ę.
źródło
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
OnEnterFrame
zdarzenia 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
goto
instrukcja, 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
źródło
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
/.h
spawnuje oddzielny wątek dla twojej pętli.źródło