Wie viele Threads sollte ein Android-Spiel verwenden?

28

Ein OpenGL-Android-Spiel enthält mindestens einen UI-Thread und einen Renderer-Thread, die von erstellt wurden GLSurfaceView. Renderer.onDrawFrame()sollte ein Minimum an Arbeit tun, um die höchsten FPS zu erhalten. Die Physik, KI usw. müssen nicht jeden Frame ausführen, damit wir diese in einen anderen Thread einfügen können. Jetzt haben wir:

  1. Renderer-Thread - Aktualisieren Sie Animationen und zeichnen Sie Polys
  2. Spielthread - Aktualisierungen von Logik und periodischer Physik, KI usw.
  3. UI-Thread - Nur Interaktion mit der Android-Benutzeroberfläche

Da Sie den UI-Thread niemals blockieren möchten, führe ich einen weiteren Thread für die Spielelogik aus. Vielleicht ist das aber nicht nötig? Gibt es jemals einen Grund, die Spielelogik im Renderer-Thread auszuführen?

kvance
quelle

Antworten:

18

Chris Pruett von Google spricht in seinem Replica Island-Blog über dieses Problem . Da es sich bei eglSwapBuffers () um einen blockierenden Aufruf im GLSurfaceView-Thread handelt, kann der Spiellogikcode in einem anderen Thread ausgeführt werden, während der Aufruf von Swap Buffers blockiert ist. Dies ist wichtig, wenn Ihr Spiel komplex ist und Sie 60 Bilder pro Sekunde erzielen möchten.

Sie können den Quellcode für Replica Island herunterladen und sehen, wie sie es getan haben. Ich habe etwas Ähnliches für mein Spiel implementiert (mit den drei Threads, über die Sie gesprochen haben) und es funktioniert großartig.

Firas Assaad
quelle
2

Android unterstützt Standard Java Threads. Sie können Standard-Threads und die Tools aus dem Paket java.util.concurrent verwenden, um Aktionen in den Hintergrund zu stellen. Die einzige Einschränkung besteht darin, dass Sie die Benutzeroberfläche nicht direkt über den Hintergrundprozess aktualisieren können.

Wenn Sie die Benutzeroberfläche über eine Hintergrundaufgabe aktualisieren müssen, müssen Sie einige Android-spezifische Klassen verwenden. Sie können hierfür die Klasse android.os.Handler oder die Klasse AsyncTasks verwenden.

Weitere Details finden Sie unter folgendem Link ....

http://mindstick.com/Articles/7a9205de-bae7-48ba-81b5-2b2ec161d672/?Thread%20in%20Android

Ratan Sharma
quelle