Combien de threads un jeu Android doit-il utiliser?

28

Au minimum, un jeu Android OpenGL a un thread d'interface utilisateur et un thread de rendu créé par GLSurfaceView. Renderer.onDrawFrame()devrait faire un minimum de travail pour obtenir le FPS le plus élevé. La physique, l'IA, etc. n'ont pas besoin d'exécuter chaque image, nous pouvons donc les mettre dans un autre thread. Maintenant nous avons:

  1. Fil de rendu - Mettre à jour les animations et dessiner des polys
  2. Fil de jeu - Mises à jour logiques et physiques, IA, etc.
  3. Fil d'interface utilisateur - Interaction d'interface utilisateur Android uniquement

Puisque vous ne voulez jamais bloquer le thread d'interface utilisateur, je lance un thread supplémentaire pour la logique du jeu. Peut-être que ce n'est pas nécessaire cependant? Y a-t-il jamais une raison d'exécuter la logique de jeu dans le thread de rendu?

kvance
la source

Réponses:

18

Chris Pruett de Google parle de ce problème dans son blog Replica Island . Étant donné que eglSwapBuffers () est un appel de blocage dans le thread GLSurfaceView, le fait d'avoir du code logique de jeu dans un autre thread lui permet de s'exécuter pendant que l'appel des tampons d'échange est bloquant. Ceci est important si votre jeu est complexe et que vous souhaitez atteindre 60 images par seconde.

Vous pouvez télécharger le code source de Replica Island et voir comment ils l'ont fait. J'ai implémenté quelque chose de similaire pour mon jeu (avec les trois fils dont vous avez parlé) et cela fonctionne très bien.

Firas Assaad
la source
2

Android prend en charge les threads Java standard. Vous pouvez utiliser les threads standard et les outils du package java.util.concurrent pour mettre les actions en arrière-plan. La seule limitation est que vous ne pouvez pas mettre à jour directement l'interface utilisateur à partir du processus d'arrière-plan.

Si vous devez mettre à jour l'interface utilisateur à partir d'une tâche d'arrière-plan, vous devez utiliser certaines classes spécifiques à Android. Vous pouvez utiliser la classe android.os.Handler pour cela ou la classe AsyncTasks.

Pour plus de détails, veuillez consulter le lien suivant ....

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

Ratan Sharma
la source