Ich bin neu in der Spieleentwicklung. Um zu lernen, erstelle ich dieses Spiel auf der Android-Plattform neu. Sie können das Gameplay-Video unter dem obigen Link ansehen. Es ist ein einfaches Spiel.
Ich habe viele Artikel über den Einstieg in die Spieleentwicklung gelesen. Fast alle haben empfohlen, eine Spieleschleife in einem separaten Thread zu verwenden, was für andere Spiele sinnvoll ist. Muss ich für dieses spezielle Spiel jedoch einen separaten Thread starten?
Antworten:
Eine Spielschleife wird im Allgemeinen empfohlen, da sie einfach ist . Fast jedes Spiel kann mithilfe einer Schleife ordnungsgemäß entwickelt und ausgeführt werden, und für die meisten Spiele ist eine ordnungsgemäße Funktion erforderlich.
Beispielsweise erfordern die meisten Physik-Engines zuverlässige ständige Aktualisierungen für eine ordnungsgemäße Simulation. Animationen und andere dynamische Inhalte und Grafiken müssen bei jeder Änderung usw. aktualisiert werden. Aka etwas, das Sie durch die Verwendung einer Schleife praktisch kostenlos erhalten.
Beachten Sie jetzt, dass Ihre Schleife nicht in einem separaten Thread ausgeführt werden muss. Tatsächlich werden die meisten Spiele der Einfachheit halber die Schleife im Haupt-Thread ausführen. Auch meine Android-Projekte folgen diesem Prinzip.
Die eigentliche Frage hier ist nun, welche Alternative schlagen Sie vor? Wenn Sie eine andere Idee haben, wie Sie zuverlässig Eingaben erhalten, Aktualisierungen vornehmen und Rahmen zeichnen können, die für Sie funktionieren, fahren Sie fort! Andernfalls ist eine Spielschleife möglicherweise der einfachste Weg, um loszulegen.
quelle
Nein , ein separater Thread ist nicht erforderlich. Wenn Sie nichts zu intensives tun (was in dem Spiel, das Sie uns gezeigt haben, nicht so aussieht), kann alles im Haupt-Thread ausgeführt werden.
Ein zweiter Thread ist erforderlich, wenn Sie viel verarbeiten oder auf andere Weise Probleme mit der Benutzeroberfläche / Eingabe haben, die nicht mehr reagieren. In komplexeren Spielen möchten Sie beispielsweise nicht, dass die Benutzeroberfläche / Eingabe nicht mehr reagiert, wenn die KI ihren nächsten Zug berechnet. Da Ihr Spiel anscheinend hauptsächlich auf Benutzereingaben und die Aktualisierung von Grafiken reagiert, ist kein zweiter Thread erforderlich.
Beantwortung der ursprünglichen Frage "Ist eine Schleife erforderlich?"
Nein , aber die Alternativen sind komplizierter, schwieriger zu implementieren und werden selten verwendet.
Spiele sind per Definition interaktiv. Zumindest wartet das auf Eingabe und Aktualisierung der Ausgabe. Der einfachste Weg, dies zu tun, ist eine mit einer Schleife. Es ist nicht erforderlich, dafür einen neuen Thread zu erstellen.
Obwohl das von Ihnen erwähnte Spiel einfach erscheint, verfügt es über interaktive Grafiken und Sounds und aktualisiert diese ständig basierend auf Benutzereingaben.
Es gibt auch nicht viele Alternativen zu einer Spielschleife. Eine Art Interrupt-basiertes System könnte möglich sein. Solche Systeme erhöhen jedoch die Komplexität und reduzieren andere Faktoren wie den Determinismus. Es gibt einen Grund, warum Spieleschleifen so häufig sind, dass sie einfach zu implementieren, leicht zu verstehen, flexibel sind und großartige Arbeit leisten.
quelle
Antwort auf die eigentliche Frage (Muss sich eine Spielschleife in einem separaten Thread befinden):
Der Grund, warum Benutzer häufig die Verwendung eines separaten Threads empfehlen, liegt darin, dass keine starke Verarbeitung die Interaktivität der Benutzeroberfläche beeinträchtigen soll. Sie sind der einzige, der feststellen kann, ob für Ihr Spiel ein separater Thread benötigt wird . Es hängt ganz von der Engine und dem Framework ab, ob die Hauptspielschleife in Ihrem aktuellen Design die Reaktionszeit der Benutzeroberfläche beeinträchtigt. Ich dachte, Sie gehen im Allgemeinen davon aus, dass dies nicht der Fall ist (bei kleinen Projekten), es sei denn, Sie haben einen Grund, anders zu denken.
Ein weiterer Grund, Code in separaten Threads zu halten, besteht darin, den Code modular und einfach zu halten. Wenn zwei nicht miteinander verbundene Codeteile zusammengemischt werden, kann dies häufig dazu führen, dass Code auf lange Sicht weniger lesbar und wartbar wird.
Muss eine Spieleschleife in einem eigenen Thread ausgeführt werden? Möglicherweise. Wenn es ein Problem mit der Antwortzeit oder dem Code gibt und Sie mehrere UI-Elemente benötigen, um unabhängig von der umfangreichen Verarbeitung zu antworten, oder wenn Sie den Code einfach in bestimmte Aufgaben aufteilen möchten, die aus Entwurfsgründen gleichzeitig ausgeführt werden, dann machen Sie mit. Es wird jedoch als fortgeschrittene Programmierpraxis angesehen.
Ein einfaches, aber vielleicht nicht gutes Beispiel ist ein Zwei-Spieler-Spiel. Möglicherweise möchten Sie zwei Instanzen einer Klasse ausführen, die Benutzereingaben verarbeitet und in Statusänderungen in der Spielercharakterinstanz konvertiert.
Einige Frameworks ermutigen / verlangen, dass Sie ein ereignis- / Interrupt-basiertes System verwenden, wie dies ActionScript3.0 tut. In diesem Fall geht der Schleifencode normalerweise zu dem
OnEnterFrame
Ereignis oder etwas Ähnlichem, das 20 - 60 oder 120 Mal pro Sekunde auftritt.Antwort auf die ursprüngliche Frage (brauche ich eine Hauptschleife):
Alles läuft auf den Programmzähler hinaus . Wenn Sie ein Spiel erstellen , das länger als eine vorgegebene Zeit läuft und dabei keinen Code generiert, müssen Sie den PC Ihres Benutzers bitten, einige Anweisungen zu wiederholen, die er bereits verarbeitet hat, und was sich möglicherweise in der ändern wird In der Zwischenzeit ist der Status (die Werte, die in den Objekten und Globals des Spiels gespeichert sind).
Da Sie wissen, dass Sie Anweisungen wiederholen müssen, gibt es verschiedene Möglichkeiten, diese Aufgabe auszuführen und dieselben Anweisungen kontinuierlich zu verarbeiten. Bei all diesen Methoden wird der Programmzähler auf den aktuell relevanten Befehl zurückgesetzt. Die häufigsten Kontrollflussanweisungen, die dazu führen, dass Code wiederholt wird, werden als Schleifen bezeichnet. Eine andere ist die
goto
Anweisung, die im modernen Code selten verwendet wird und in diesem Fall einen ähnlichen Effekt hat (für Sie völlig nicht relevant).Benötigen Sie eine Schleife, um Ihre vorherige Frage zu beantworten? Ja, das tust du.
quelle
Nur um die Antworten einiger anderer hier zu ergänzen, etwas, das niemand ausdrücklich erwähnt hat: Wenn Sie das Risiko eingehen, Ihre Spieleschleife in einem zweiten Thread auszuführen und diese nicht mehr reagiert, riskieren Sie, dass das Betriebssystem Ihre Anwendung beendet. Aus diesem Grund wird empfohlen, einen separaten Thread zu verwenden. Daher (zum Beispiel) erzeugt der NDK
native_app_glue.c
/.h
erzeugt einen separaten Thread für Ihre Schleife.quelle