2009-04-13 18 views
1

Ich benutze UIImage, um eine Spielkarte aus 32x32 Blöcken zu rendern. Der Code lautet wie folgtWarum bekomme ich schlechte Leistung beim Rendern verschiedener Bilder mit UIImage auf 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]; 
    } 
} 

Dies endet mit dem Rendern von etwa 150 Kacheln. Mein Problem ist, wenn ich diesen Code starte, geht meine Renderzeit auf 2-3 Frames pro Sekunde runter.

Ich dachte, das iPhone war Füllung gebunden, aber wenn ich bindex zu = 1 (dh rendern den gleichen Block 150 Mal), dann bekomme ich volle Bildrate.

Ich kann nicht glauben, dass es so teuer ist, aus verschiedenen UIImages zu rendern.

Könnte ich bitte jemand sagen, was ich falsch mache ...

Oh ich von einer größeren Textur Seite mit CGImageCreateWithImageInRect erstellt vergessen, meine Bildliste zu erwähnen.

Dank Rich-

+0

Hat jeder Index in img_list Referenz eine andere Textur/Bild aus separaten Dateien geladen? – Venesectrix

+0

Oh, ich habe vergessen, meine Bildliste zu erwähnen, die mit CGImageCreateWithImageInRect aus einer größeren Texturseite erstellt wurde. – Rich

+0

Entschuldigung, Ihre Frage zu beantworten, nein. – Rich

Antwort

1

Riss offen Instrumente und Ihren Code profilieren. Es sieht so aus, als ob Sie in eine UIView zeichnen, und sie sind nicht wirklich für Spiele optimiert. Da UIViews Layer-Backed sind, muss drawAtPoint: das Bild mehrmals (in Offscreen-Puffer) zeichnen, bevor es auf dem Bildschirm erscheint.

Das heißt, UIImage ist nicht wirklich für Spiele konzipiert. Es gibt eine Menge Aufwand, um Teil von UIKit zu sein. Du bist nicht wirklich dazu bestimmt, Hunderte von ihnen zu haben.

In ca. Reihenfolge der Geschwindigkeit (langsamsten schnellsten):

  • UIImage (in der Regel verwendet, wenn Sie ein paar großen Bilder haben)
  • CALayers (wenn Sie die gute Animationssteuerung benötigen, oder Sie haben etwa 20 bis 100 Fliesen/images)
  • OpelGL Texturen (was die meisten Spiele verwenden sollten)
+0

Danke, ich wollte direkt zu opengl gehen, aber die Dokumente haben mich überzeugt, dass CGDrawImage stark optimiert wurde. Da ich nur einen gekachelten Hintergrund brauchte, dachte ich, dass es gut genug war ... denke nicht. – Rich