Question

Je travaille sur un jeu de défilement 2D pour iPhone. J’ai un grand fond d’image, disons 480 × 6000 pixels, dont seule une partie est visible (une valeur d’écran est exactement égale à 480 × 320 pixels). Quel est le meilleur moyen d’obtenir un tel fond à l’écran?

Actuellement, l’arrière-plan est divisé en plusieurs textures (pour contourner la limite maximale de taille de texture) et dessine l’arrière-plan entier dans chaque image sous la forme d’une bande triangulaire texturée. Le défilement se fait en traduisant la matrice modelview. La boîte à ciseaux est définie sur la taille de la fenêtre, 480 × 320 pixels. Ce n’est pas censé être rapide, je voulais juste un code fonctionnel avant d’optimiser.

Je pensais que l’implémentation OpenGL serait peut-être assez intelligente pour supprimer la partie invisible de l’arrière-plan, mais selon un code de mesure j’ai écrit que l’arrière-plan prend 7 & nbsp; ms pour dessiner en moyenne et 84 & ms maximum; (Ceci est mesuré dans le simulateur.) Il s’agit de la moitié environ de la boucle de rendu, c’est-à-dire. assez lent pour moi.

Dessiner l’arrière-plan doit être aussi simple que de copier 480 × 320 pixels d’une partie de la VRAM à une autre ou, en d’autres termes, une vitesse de pointe. Quel est le meilleur moyen de se rapprocher d’une telle performance?

Était-ce utile?

La solution

C'est le moyen rapide de le faire. Ce que vous pouvez faire pour améliorer les performances:

  • Essayez différents formats de texture. Vraisemblablement, les documents du SDK ont des détails sur le format préféré, et probablement plus petit est meilleur.
  • Éliminez vous-même les mosaïques hors écran
  • Divisez l'image en textures plus petites

Je suppose que vous dessinez à un niveau de zoom 1: 1; est-ce le cas?

Modifier: Oops. Après avoir lu votre question plus attentivement, je dois donner un autre conseil: Les chronométrages effectués sur le simulateur ne valent rien.

Autres conseils

La solution rapide:

  • Créez une matrice de géométrie de mosaïques (quadruples de préférence) de manière à ce qu’il y ait au moins une rangée / colonne de mosaïques hors écran de tous les côtés de la zone visible.

  • Mappez les textures sur toutes ces tuiles.

  • Dès qu'une tuile se trouve en dehors de la zone visible, vous pouvez libérer cette texture et en lier une nouvelle.

  • Déplacez les mosaïques en utilisant un modulo de la largeur et de la hauteur de la mosaïque comme position (de sorte que la mosaïque se repositionne à sa position de départ lorsqu'elle a été déplacée d'une longueur exactement d'une mosaïque). Pensez également à remapper les textures lors de cette opération. Cela vous permet d'avoir une très petite grille / très peu de mémoire de texture chargée à un moment donné. Ce qui, à mon avis, est particulièrement important dans GL ES.

Si vous avez de la mémoire libre et que la vitesse de chargement est lente, vous ne devez pas utiliser autant de textures. Vous pouvez créer un moteur de diffusion de texture qui précharge les textures dans une mémoire plus rapide (quel que soit le contenu de votre périphérique cible) lorsque vous atteignez une nouvelle zone. Dans ce cas, le mappage sous forme de textures passera de cette mémoire plus rapide en cas de besoin. Assurez-vous simplement de pouvoir le précharger sans utiliser toute la mémoire et n'oubliez pas de le libérer dynamiquement lorsque vous n'en avez pas besoin.

Voici un lien vers un moteur de tuiles GL (pas ES). Je ne l'ai pas utilisé moi-même, je ne peux donc pas en garantir le fonctionnement, mais il pourra peut-être vous aider: http://www.mesa3d.org/brianp/TR.html

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top