Question

Je développe un jeu 2D pour iPhone avec OpenGL ES et j'aimerais utiliser une image bitmap 320x480 comme arrière-plan persistant.

Ma première idée a été de créer un quad 320x480, puis d’y appliquer une texture qui représente l’arrière-plan. Alors ... j'ai créé une texture de 512x512 avec une image de 320x480 dessus. Ensuite, j'ai mappé cela sur le quad 320x480.

Je dessine cet arrière-plan à chaque image, puis j'y dessine des sprites animés. Cela fonctionne très bien sauf que le dessin de tous ces objets (fond + sprites) est trop lent.

J'ai fait quelques tests et découvert que mon ralentissement est dans le pipeline de pixels. Sans surprise, la grande image de fond est le principal responsable. Pour le prouver, j'ai supprimé le dessin d'arrière-plan et tout le reste rendu très rapidement.

Je cherche des conseils sur la façon de conserver mon passé et d’améliorer les performances.

Voici quelques informations supplémentaires:

1) Je teste actuellement sur le simulateur (toujours en attente de licence pour Apple)

2) L’arrière-plan est une texture PVR réduite à 128 Ko

3) J'espérais qu'il pourrait y avoir un moyen de mettre en cache cet arrière-plan dans un tampon de couleur, mais je n'ai pas eu de chance avec cela. cela peut être dû à mon inexpérience avec OpenGL ES ou à une idée stupide qui ne fonctionnera pas :)

4) Je réalise que tout l’arrière-plan n’a pas toujours besoin d’être actualisé, mais uniquement les parties dessinées par les images-objets en mouvement. J'ai commencé à étudier des techniques permettant de rafraîchir (si nécessaire) des parties de l'arrière-plan, soit sous forme de textures séparées, soit à l'aide d'une boîte à ciseaux. Toutefois, cela semble moins élégant.

Tous les conseils / conseils seraient grandement appréciés ...

Merci.

Était-ce utile?

La solution 3

Merci à tous ceux qui ont fourni des informations à ce sujet. Tous les conseils ont aidé d'une manière ou d'une autre.

Cependant, je voulais préciser que le problème principal s’avérait être le comportement du simulateur lui-même (comme l’indiquait Andreas dans sa réponse). Une fois que j'ai pu obtenir l'application sur l'appareil, les performances ont été bien meilleures. Je le mentionne car, avant de développer mon jeu, j'avais vu beaucoup de publications qui indiquaient que l'appareil était beaucoup plus lent que le simulateur. Cela peut être vrai dans certains cas (par exemple, la logique d'application générale), mais d'après mon expérience, les animations (en particulier les transformations 3D) sont beaucoup plus rapides sur le périphérique.

Autres conseils

  1. Ne testez pas les performances du simulateur. Jamais!
    Les différences par rapport au matériel réel sont énormes. Dans les deux sens.
  2. Si vous dessinez l'arrière-plan à chaque image:
    Ne pas effacer le framebuffer. De toute façon, l’arrière-plan recouvrira le tout.
  3. Avez-vous vraiment besoin d'une texture d'arrière-plan?
    Qu'en est-il de l'utilisation d'un dégradé de couleur via les couleurs de vertex?
  4. Essayez d’utiliser le mode 2 bits pour la texture.
  5. Désactive toutes les étapes de rendu dont vous n'avez pas besoin pour l'arrière-plan.
    Exemple: éclairage, mélange, test de profondeur, ...

Si vous pouviez publier une partie de votre code de dessin, il serait beaucoup plus facile de vous aider.

Si vous créez un jeu en 2D, y a-t-il une raison pour laquelle vous n'utilisez pas une bibliothèque existante? Plus précisément, le cocos2d pour iPhone peut valoir votre temps. Je ne peux pas répondre à votre question sur la façon de résoudre le problème en le faisant vous-même, mais je peux dire que j'ai fait exactement ce dont vous parlez (avoir un fond d'écran avec des sprites au-dessus) avec cocos2d et ça marche génial. (En supposant que 60 images par seconde soient assez rapides pour vous.) Vous pouvez avoir vos raisons pour le faire vous-même, mais si vous le pouvez, je suggérerais fortement de faire au moins un prototype rapide avec cocos2d et de voir si cela ne vous aidera pas. (Les détails et la source de la version iPhone se trouvent ici: http://code.google.com/ p / cocos2d-iphone / )

Je n'ai pas beaucoup d'expérience avec OpenGL ES, mais ce problème se produit généralement.

Votre idée sur le "tampon de couleur" est une bonne intuition. Vous voulez essentiellement stocker votre arrière-plan en tant que tampon d'image et le charger directement dans votre tampon de rendu avant de dessiner le premier plan.

Sous OpenGL, c’est assez simple avec les FBO (Frame Buffer Objects). Malheureusement, je ne pense pas qu'OpenGL ES les prenne en charge, mais cela pourrait vous donner un endroit où commencer à regarder.

vous pouvez essayer d’utiliser des VBO (Vertex Buffer Objects) et voir si cela accélère les choses. Le didacticiel est ici

.

En outre, je viens de constater que, depuis OpenGL ES v1.1 , il est une fonction appelée glDrawTex (Draw Texture) conçue pour

  

rendu rapide des peintures de fond, des glyphes de polices bitmap et des éléments de cadrage 2D dans les jeux

  1. Vous pouvez utiliser des objets frame buffer similaires à l'exemple GLPaint d'Apple.
  2. Utilisez un atlas de texture pour réduire le nombre d'appels de tirage effectués. Vous pouvez utiliser glTexCoordPointer pour définir les coordonnées de la texture qui mappe chaque image à la position correcte. N'oubliez pas de définir votre tampon de sommets aussi. Idéalement, un appel de dessin rendra votre scène 2D entière.
  3. Évitez d’activer / désactiver les états dans la mesure du possible.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top