2009-04-13 7 views
1

J'utilise UIImage pour rendre une carte de jeu à partir de blocs 32x32. Le code est le suivantPourquoi ai-je des performances médiocres lors du rendu d'images différentes avec UIImage sur l'iPhone

for(int x = 0; x < rwidth; ++x) 
{ 
    for(int y = 0; y < rheight; ++y) 
    { 
     int bindex = [current_map GetTileIndex:x :y]; 
     CGPoint p; 
     p.x = x * tile_size_x; 
     p.y = y * tile_size_x; 
     [img_list[bindex] drawAtPoint:p]; 
    } 
} 

Cela finit par rendre environ 150 dalles. Mon problème est quand j'exécute ce code mon temps de rendu descend à 2-3 images par seconde.

Je pensais que l'iPhone était lié, mais si je force bindex à = 1 (c'est-à-dire que je rends le même bloc 150 fois) alors je reçois un framerate complet.

Je n'arrive pas à croire que le rendu à partir de différentes UIImages soit aussi coûteux.

Quelqu'un pourrait-il s'il vous plaît me dire ce que je fais mal ...

Oh j'oublié de mentionner ma liste d'image créée à partir d'une page plus grande de la texture à l'aide CGImageCreateWithImageInRect.

Merci Rich

+0

Est-ce que chaque indice en référence img_list une autre texture/image chargée à partir de fichiers séparés? – Venesectrix

+0

Oh j'ai oublié de mentionner ma liste d'images créée à partir d'une page de texture plus grande en utilisant CGImageCreateWithImageInRect. – Rich

+0

Désolé de répondre à votre question, non. – Rich

Répondre

1

entrouvrir Instruments et le profil de votre code. Il semble que vous dessinez dans un UIView, et ils ne sont pas vraiment optimisés pour les jeux. Comme UIViews est soutenu par une couche, drawAtPoint: doit dessiner l'image plusieurs fois (sur les tampons hors écran) avant qu'il n'apparaisse à l'écran. Cela étant dit, UIImage n'est pas vraiment conçu pour les jeux. Il y a beaucoup de frais généraux pour faire partie d'UIKit. Vous n'êtes pas vraiment censé en avoir des centaines.

Dans environ ordre de vitesse (le plus lent au plus rapide):

  • UIImage (généralement utilisé si vous avez quelques grandes images)
  • CALayers (si vous avez besoin un contrôle précis de l'animation ou si vous avez à peu près 20 à 100 tuiles/images)
  • textures OpelGL (ce que la plupart des jeux devraient utiliser)
+0

Merci, j'allais aller directement à opengl, mais les docs ont continué à me persuader que CGDrawImage était hautement optimisé. Comme je n'avais besoin que d'un fond en mosaïque, je me suis dit que c'était assez bon ... je suppose que non. – Rich