Frage

Ich fragte vor etwa Pixel drängen, und habe nun weit genug zu erhalten, Lärm zu zeigen, bis auf dem Bildschirm gesteuert. Hier ist, wie ich init:

CGDataProviderRef provider;
bitmap = malloc(320*480*4);
provider = CGDataProviderCreateWithData(NULL, bitmap, 320*480*4, NULL);
CGColorSpaceRef colorSpaceRef;
colorSpaceRef = CGColorSpaceCreateDeviceRGB();
ir = CGImageCreate(
320,
480,
8,
32,
4 * 320,
colorSpaceRef,
kCGImageAlphaNoneSkipLast,
provider,
NULL,
NO,
kCGRenderingIntentDefault
);

Hier ist, wie ich jedes Bild machen:

for (int i=0; i<320*480*4; i++) {
bitmap[i] = rand()%256;
}
CGRect rect = CGRectMake(0, 0, 320, 480);
CGContextDrawImage(context, rect, ir); 

Das Problem ist, das ist furchtbar furchtbar langsam, um 5 Bilder pro Sekunde. Ich glaube, mein Weg, den Puffer zu veröffentlichen falsch sein muss. Ist es sogar möglich, Vollbild pixelbasierte Grafiken zu tun, dass ich bei 30 Bildern pro Sekunde aktualisieren konnte, ohne den 3D-Chip?

War es hilfreich?

Lösung

Die Langsamkeit ist mit ziemlicher Sicherheit in der Geräuschentwicklung. sehen, wenn Sie dies in Instruments laufen werden Sie wahrscheinlich, dass eine Menge Zeit in der Schleife abgesessen werden.

Ein anderes kleineres Problem ist Ihr Farbraum. Wenn Sie den Bildschirm des Farbraum verwenden, erhalten Sie eine Farbraumkonvertierung vermeiden, die möglicherweise teuer ist.

Wenn Sie Core Graphics-Routinen für Ihre Zeichnung verwenden können, sollten Sie besser bedient werden würden durch eine CGLayer für die Zeichnung Kontext zu schaffen, anstatt ein neues Objekt jedes Mal zu schaffen.

Die bytesPerRow Komponente ist auch wichtig für die Leistung. Es soll ein Faktor von 32 IIRC sein. Es gibt einige Code verfügbar Link-Text , die zeigt, wie es zu berechnen, .

Und ja, für rohe Leistung, OpenGL.

Andere Tipps

Ich vermute, tun 614400 (320*480*4) Speicher schreibt, Erzeugung von Zufallszahlen und machen ein neues Objekt jeder Frame Sie verlangsamt.

Haben Sie versucht, nur eine statische Bitmap schreiben zu screenen und zu sehen, wie schnell das ist? Haben Sie vielleicht versucht, den Code Profilierungs? Sie benötigen auch eine neue CGRect jedes Mal zu machen?

Wenn Sie nur die Wirkung des Zufalls geben wollen, gibt es wahrscheinlich keine Notwendigkeit, die gesamte Bitmap jedes Mal zu regenerieren.

Mein Wissen ist OpenGL soll der schnellste Weg, um Grafiken auf dem iPhone zu tun. Dazu gehören 2D und 3D. A UIView wird durch eine Kernanimationsebene gesichert, die ohnehin mit OpenGL Zeichnung endet. Warum also nicht überspringen Sie die Mitte-Mann.

Sie haben die Reise durch CGContextDrawImage durch die Zuordnung Ihrer CGImageRef vermeiden können -[CALayer setContents:], nur sicher sein, nicht Bitmap zu befreien, während Sie es noch verwenden.

[[view layer] setContents:(id)ir];

Ja, ich weiß, das alt ist, ich stolperte über es von Google

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top