CGBitmapContextCreate auf dem iPhone/iPad
Habe ich eine Methode, die Bedürfnisse zu analysieren, durch ein Bündel von großen PNG-Bilder pixel für pixel (die PNGs werden 600x600 Pixel). Es scheint gut zu funktionieren, auf dem Simulator, aber auf dem Gerät (iPad), ich bekomme eine EXC_BAD_ACCESS in einigen internen Speicher kopieren-Funktion. Es scheint, die Größe der Schuldige, weil wenn ich es versuche auf die kleineren Bilder, alles scheint zu funktionieren. Hier ist die Speicher-bezogene Fleisch der Methode unten.
+ (CGRect) getAlphaBoundsForUImage: (UIImage*) image
{
CGImageRef imageRef = [image CGImage];
NSUInteger width = CGImageGetWidth(imageRef);
NSUInteger height = CGImageGetHeight(imageRef);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
unsigned char *rawData = malloc(height * width * 4);
memset(rawData,0,height * width * 4);
NSUInteger bytesPerPixel = 4;
NSUInteger bytesPerRow = bytesPerPixel * width;
NSUInteger bitsPerComponent = 8;
CGContextRef context = CGBitmapContextCreate(rawData, width, height, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGColorSpaceRelease(colorSpace);
CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef);
CGContextRelease(context);
/* non-memory related stuff */
free(rawData);
Wenn ich diese auf ein paar Bilder, es läuft 12 mal und dann scheißt aus, während der simulator läuft es ohne problem. Habt Ihr irgendwelche Ideen?
InformationsquelleAutor toastie | 2010-04-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Läuft 12 mal und dann abstürzt, klingt wie ein running out of memory-problem. Könnte es sein, dass intern die CGContext ist die Schaffung von einigen großen autoreleased Strukturen. Da tun Sie dies in einer Schleife, Sie sind nicht immer befreit, so dass Sie run out of memory und sterben.
Ich bin mir nicht sicher, wie Kern-Stiftung befasst sich mit temporären Objekten wenn. Ich glaube nicht, dass CF-Objekte haben den Gegenwert von autorelease, und ein Core-Graphics-Kontext, wird fast sicher im Umgang mit CF-Objekte anstatt NSObjects.
Zur Verringerung der Speicher stößt in Ihrem code, würde ich vorschlagen, refactoring es zum erstellen eines offscreen-CGContext einmal, bevor Sie mit der Verarbeitung beginnen, und verwenden Sie es wiederholt zu jedem Prozess Bild. Dann lassen Sie es, wenn Sie fertig sind. Das ist schneller auf jeden Fall (da Sie nicht die Zuweisung riesigen Daten-Strukturen, die bei jedem Durchlauf durch die Schleife.)
Ich Wette, das wird beseitigen Ihre crash-problem, und ich Wette, es macht auch Ihr code viel, viel schneller. Wird der Speicher sehr langsam im Vergleich zu anderen Operationen, und Sie anschlagen, um einige ziemlich große Datenstrukturen zu handhaben 600x600 pixel RGBA-Bilder.
InformationsquelleAutor Duncan C
Goto Produkt -> Bearbeiten-Schemata -> Aktivieren Zombie-Objekte. Setzen Sie ein Häkchen vor Enable Zombie-Objekte. Jetzt bauen und führen Sie es. Es kann Ihnen eine bessere und auf den Punkt Beschreibung für EXC_BAD_ACCES Fehler.
InformationsquelleAutor innodeasapps
War ich immer zu einem ähnlichen Absturz auf meinem iPad (iPhoneOS 3.2 natürlich) mit CGImageCreate(). Sehen Sie Ihre Schwierigkeiten gab mir einen Tipp. Ich löste das problem durch die Ausrichtung meiner bytesPerRow auf die nächsthöhere Potenz von 2 ist.
size_t bytesPerRowPower2 = (size_t) round( pow( 2.0, trunc( log((double) bytesPerRow) /log(2.0) ) + 1.0 ) );
Lassen Sie uns wissen, wenn die macht der 2 Zeile Ausrichtung auch Ihr problem löst. Würden Sie zuteilen müssen *rawData mit der Größe angepasst und pass bytesPerRowPower2 zu CGBitmapContextCreate()... Die Höhe nicht zu benötigen scheinen Ausrichtung.
InformationsquelleAutor ctpenrose
Vielleicht CGImageGetBytesPerRow (Kraft der zwei sounds übermäßig).
InformationsquelleAutor David Dunham
Habe ich eine Leistung von zwei ausgerichtet Zeilengröße in einer app zu definieren, die Zeile die Größe direkt so, wie ich war, Bilder zu schaffen, die programmgesteuert. Aber ich würde auch empfehlen, toastie, um zu versuchen, CGImageGetBytesPerRow, bevor Sie versuchen, mein Vorschlag als gut.
InformationsquelleAutor ctpenrose
Versuchen zu Laufen, Instrumenten-Zuweisung während der Ausführung der Anwendung auf dem Gerät, es kalt werden' ein Speicher-Problem im Zusammenhang. Wenn Sie in einer Schleife, erstellen Sie innerhalb dieser Schleife eine auto-release-pool.
InformationsquelleAutor Andrea
Vielleicht ersetzen
mit
als Farbraum ref vielleicht noch irgendwie gebraucht? Nur eine zufällige erraten...
Und vielleicht ist es sogar hinter der Veröffentlichung der Kontext?
InformationsquelleAutor Eduard Feicho
Habe ich das problem gelöst, indem Sie einen quadratischen Rahmen (Breite=Höhe). Ich war mit einer 512x256 textur und es abstürzt, jedes mal, wenn ich schickte die Daten an OpenGL. Jetzt habe ich weisen Sie eine 512x512-Puffer, ABER immer NOCH Rendern 512x256. Hoffe, das hilft.
InformationsquelleAutor RelativeGames