несколько моментальных снимков GLKview вызывают сбой. Проблема с памятью?

Моя цель — сделать видео из короткой последовательности кадров opengl (около 200 кадров). Поэтому для этого я использую следующий код для создания массива изображений:

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];

Так что это отлично работает на симуляторе, но не на устройстве (с сетчаткой iPad). Итак, я предполагаю, что устройство не поддерживает так много UIimages (особенно в 2048 * 1536). Сбой всегда происходит после 38 кадров или около того.

Теперь, что касается решения, я думал создать видео для каждых 10 кадров, а затем соединить их все вместе, но когда я могу узнать, достаточно ли у меня места (пул авторелиза слит?).

Может быть, мне следует использовать поток, обработать 10 изображений и снова запустить его для следующих 10 кадров, когда все закончится?

Любая идея?


person Zerto    schedule 04.07.2012    source источник


Ответы (1)


Вполне вероятно, что у вас заканчивается память.

Чтобы уменьшить использование памяти, вы можете попытаться сохранить изображения как NSData, используя вместо этого формат PNG или JPG. И PNG, и JPG довольно малы, когда представлены в виде данных, но их загрузка в объекты UIImage может занимать очень много памяти.

Я бы посоветовал вам сделать что-то вроде ниже в вашем цикле. Пул автовыпуска необходим для слива возвращаемого моментального снимка на каждой итерации.

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

Это, конечно, требует, чтобы ваш метод createVideoFileFromArray: обрабатывал чистые данные изображения вместо объектов UIImage, но это, вероятно, должно быть реализовано.

person Anton    schedule 04.07.2012