2010-11-28 8 views
0
renderer

J'écris actuellement un jeu sur Android en utilisant un design inspiré par Replica Island. C'est-à-dire une approche dual thread, un thread logique et un thread de rendu.conception simultanée Android

Je possède ce mis en place avec un module de rendu léger assis dans le fil logique où il fondamentalement juste gérer des objets de jeu qui veut être renderable. Il envoie des commandes de rendu au thread de rendu, comme "render sprite f at x, y".

J'aime cette conception, mais le problème pour moi dans la création occupe actuellement des ressources. Dites que sprite f a besoin d'une texture, elle sera demandée par lui dans le thread logique lors du chargement. Le problème est que parce que le contexte OpenGL est dans le thread de rendu, la texture ne peut être créée que dans le thread de rendu. Actuellement, le seul point de synchronisation entre le fil logique et le fil est rendu quand ils échangent rendre les files d'attente à la fin d'un cadre et je voudrais garder cette façon.

Comment puis-je résoudre le problème de vouloir créer des textures, le etc de vbo sur le fil logique tout en ne rendant des choses sur le fil rendu? Le partage des contextes OpenGL serait-il une bonne approche? Ou un autre design du moteur peut-être?

EDIT: Un alternativ serait d'avoir une autre file d'attente où vous mettriez demandes du fil logique. Comme "create texture" etc. Le thread de rendu va itérer cette file et la traiter avant de commencer à rendre l'autre file. Je commence à aimer cette solution.

Répondre

2

OpenGL requiert que glBindTexture soit appelé à partir du thread de rendu. Je vous suggère fortement de faire une liaison à partir de la méthode GLSurfaceView.Renderer onSurfaceCreated (appelée par le thread de rendu). Si le contexte GL est recréé, il sera à nouveau appelé pour tout relier.

Si vous choisissez de le piloter à partir d'un autre thread, passez le thread de rendu à runnable en appelant queueEvent sur votre objet GLSurfaceView. Attention à la course où onSurfaceCreated n'a pas encore été appelé.

Bonne chance avec votre jeu!

Questions connexes