Ist ein separater Thread für die Spieleschleife für einfache Spiele obligatorisch?


10

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?


Mögliches Duplikat der Best Practices
Anko

Ich bin mir nicht sicher, ob dies ein Duplikat ist, da es sich um Android handelt. Es gibt einige andere Überlegungen zum Threading in einer Java-basierten Plattform, die sich von dieser Frage unterscheiden.
Sean Middleditch

Antworten:


8

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.


Die Alternative, die ich denke, besteht darin, den Bildschirm mithilfe des Hauptthreads selbst zu aktualisieren, da alle Aktionen in Reihe geschaltet sind. Der Spieler wischt über gleichfarbige Bälle, dann verschwinden alle berührten Bälle, die verbleibenden Bälle fallen zusammen mit Ersatzbällen unter die Schwerkraft.
Jin

Sie fragen also nicht, ob eine Schleife erforderlich ist? Ihr Hauptanliegen ist, ob es sich um einen separaten Thread handeln muss, richtig?
AturSams

1
richtig. Meine Frage betrifft den Thread, nicht die Schleife. Muss ich für solch ein einfaches Spiel (obwohl ich das Glück habe, ein solches Spiel machen zu können) einen neuen Thread erstellen oder kann alles auf dem Haupt-Thread ausgeführt werden?
Jin

1
Nein, es ist nicht notwendig. Solange Sie eine Schleife haben , müssen Sie keine zweite Schleife erstellen .

@jin du solltest dann wirklich den Titel ändern und wie du deine Frage schreibst.
Vallentin

5

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.


Das einzige Mal, dass ich auf Interrupts niedrigerer Ebene stieß, war, als eine bestimmte HW-Aufgabe erledigt wurde und die CPU / das Betriebssystem benachrichtigt werden musste, damit sie ordnungsgemäß verarbeitet werden konnten (Daten von der Festplatte in den Speicher lesen und dann benachrichtigt werden, dass sie bereit sind, damit wir zurückkehren können Kontrolle über die Anwendung und Erlaubnis, sie zu verarbeiten), damit ich nicht weiß, was Sie meinen, und sie einfach falsch interpretiert habe.
AturSams

2

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 OnEnterFrameEreignis 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 gotoAnweisung, 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.


1
Soweit ich weiß, läuft unter ereignisbasierten Frameworks wie AS3 immer noch eine Spielschleife. Ich spreche von Interrupts auf niedrigerer Ebene, nicht von einem Framework, das ein Ereignissystem implementiert.
MichaelHouse

Hmm .. Ich glaube nicht, dass Leute in Spielen oft Interrupts niedrigerer Ebene verwenden. AFAIK Sie werden hauptsächlich von der CPU zur Überwachung von E / A-Vorgängen verwendet. Ich habe mir eine Abstraktion auf höherer Ebene als Entwurfspraxis vorgestellt, bei der Sie auf Benutzereingaben oder Hardwareaktivitäten (ohne Abfrage) reagieren, anstatt in jedem Frame mehrere Anweisungen auszuführen und dann die HW anzuweisen, das Ergebnis zu rendern.
AturSams

1
Ja, die Leute benutzen diese nicht mehr oft. Wie ich schon sagte, sie sind schwerer zu bedienen und wir haben jetzt viel bessere Möglichkeiten, Dinge zu tun. Ich verstehe, was Sie sagen, und es ist sicherlich eine andere Art, Dinge zu betrachten, aber nur an der Oberfläche sieht es anders aus, darunter ist es die gleiche Art von Schleife.
MichaelHouse

Ich stimme @ Byte56 zu, es läuft auf eine Schleife hinaus, es sei denn, es handelt sich um Ereignisse auf Kernelebene, die E / A-Interrupts verwenden.
Konzept3d

1
Ich weiß das, aber fast alles, was wir tun, ist unter der Oberfläche dasselbe (wie gesagt, den Wert des Programmzählers ändern). Dies ist kein Geheimnis und ich habe in der Antwort darauf hingewiesen. Die ereignisbasierte Programmierung scheint unterschiedlich zu sein, da wir den Programmzähler auf verschiedene Funktionen verschieben, wenn verschiedene Ereignisse auftreten. Offensichtlich gibt es wahrscheinlich eine Schleifenabfrage, um zu überprüfen, ob diese Ereignisse kürzlich aufgetreten sind, aber als Entwurfsprinzip scheint dies anders zu sein.
AturSams

0

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/ .herzeugt einen separaten Thread für Ihre Schleife.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.