varias instantáneas de GLKview provocan un bloqueo. ¿Problema de memoria?

Mi objetivo es hacer un video a partir de una secuencia corta de fotogramas abiertos (alrededor de 200 fotogramas). Entonces, para hacer esto, uso el siguiente código para crear una matriz de imágenes:

NSMutableArray* images = [NSMutableArray array];
KTEngine* engine = [KTEngine sharedInstance]; //Opengl - based engine

for (unsigned int i = engine.animationContext.unitStart; i < engine.animationContext.unitEnd ; ++i)
{
    NSLog(@"Render Image %d", i);
    [engine.animationContext update:i];
    [self.view setNeedsDisplay];
    [images addObject:[view snapshot]];
}

NSLog(@"Total image rendered %d", [images count]);
[self createVideoFileFromArray:images];

Así que esto funciona perfectamente bien en el simulador, pero no en el dispositivo (retina iPad). Entonces, supongo que el dispositivo no admite tantas imágenes de interfaz de usuario (especialmente en 2048 * 1536). El bloqueo siempre ocurre después de 38 fotogramas más o menos.

Ahora, en cuanto a la solución, pensé en crear un video para cada 10 cuadros y luego adjuntarlos todos juntos, pero ¿cuándo puedo saber si tengo suficiente espacio (¿se agotó el grupo de liberación automática?).

¿Tal vez debería usar un hilo, procesar 10 imágenes y dispararlo nuevamente para los próximos 10 cuadros una vez que termine?

¿Alguna idea?

preguntado el 04 de julio de 12 a las 11:07

1 Respuestas

Parece bastante probable que te estés quedando sin memoria.

Para reducir el uso de la memoria, puede intentar almacenar las imágenes como NSData utilizando el formato PNG o JPG. Tanto los PNG como los JPG son bastante pequeños cuando se representan como datos, pero cargarlos en objetos UIImage puede resultar complicado. consume memoria.

Te aconsejo que hagas algo como lo que se muestra a continuación en tu bucle. El grupo de liberación automática es necesario para drenar la instantánea devuelta en cada iteración.

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
UIImage *image = [view snapshot];
NSData *imageData = UIImagePNGRepresentation(image);
[images addObject:imageData];
[pool release];

Esto, por supuesto, requiere su método createVideoFileFromArray: para manejar datos de imagen puros en lugar de objetos UIImage, pero eso probablemente debería ser factible de implementar.

Respondido 05 Jul 12, 09:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.