2009-10-02 5 views
2

Est-il possible de créer un objet UIImage à partir d'une surface hors écran sans copier les données de pixel sous-jacentes?Partage de mémoire entre CGImageRef et UIImage

Je voudrais faire quelque chose comme ceci:

// These numbers are made up obviously... 
CGContextRef offscreenContext = MyCreateBitmapContext(width, height); 

// Draw into the offscreen buffer 
// Draw commands not relevant... 

// Convert offscreen into CGImage 
// This consumes ~15MB 
CGImageRef offscreenContextImage = CGBitmapContextCreateImage(offscreenContext); 

// This allocates another ~15MB 
// Is there any way to share the bits from the 
// CGImageRef instead of copying the data??? 
UIImage * newImage = [[UIImage alloc] initWithCGImage:offscreenContextImage]; 

// Releases the original 15MB, but the spike of 30MB total kills the app. 
CGImageRelease(offscreenContextImage); 
CGContextRelease(offscreenContext); 

La mémoire est libérée et égalise à la taille acceptable, mais la pointe de la mémoire de 30MB est ce qui tue l'application. Est-il possible de partager les données de pixels?

Je l'ai considéré sauver la mémoire tampon hors écran dans un fichier et charger les données à nouveau, mais c'est un hack et les méthodes pratiques pour l'iPhone ont besoin d'un UIImage pour le sauver ...

Répondre

-2

Peut-être

UIImage *newImage = [[UIImage alloc[ initWithData:offScreenContext]; 
+0

UIImage: initWithData prend un paramètre NSData *, je ne l'ai pas vu un moyen d'obtenir NSData * de CGImageRef ou CGContextRef. – Shawn

+0

NSData est fourni avec des formats d'image tels que JPEG et PNG, que vous pouvez utiliser via initWithData. Dans le cas contraire, vous obtenez des blocs NSData * sur un UIImage avec des appels PNGRepresentation et JPGRepresentation. Donc, ça ne t'aiderait pas. –

0

Vous pouvez essayer de libérer le contexte juste après avoir créé CGImage, en libérant la mémoire utilisée par le contexte, car CGBitmapContextCreateImage() crée une copie du contexte.

Comme ceci:

CGImageRef offscreenContextImage = CGBitmapContextCreateImage(offscreenContext); 

CGContextRelease(offscreenContext); 

UIImage * newImage = [[UIImage alloc] initWithCGImage:offscreenContextImage]; 

// ... 

CGImageRelease(offscreenContextImage); 
+2

L'appel CGBitmapContextCreateImage est ce qui a alloué le gros morceau de mémoire. Libérer quoi que ce soit là ne devrait pas avoir d'impact sur l'initialisation de l'UIImage. Ce n'est pas la bonne réponse. J'ai donc essayé autre chose. Tous mes résultats précédents étaient avec le SDK 3.0. J'ai compilé avec le SDK 3.1 et mes allocations sont passées d'un état stable de 15 Mo avec un pic de 30 Mo à un état stable de 2 Mo avec un pic de 6 Mo. Incroyable! Je suis retourné et j'ai nettoyé les deux versions pour m'assurer que mes données étaient correctes et qu'elles l'étaient. ObjectAlloc a montré les mêmes résultats. On dirait que le 3.1 SDK a résolu certains problèmes de mémoire. – Shawn