Выпуск IOSurface

Этот вопрос является дополнением к:
Ссылка-1: Создание изображения из поверхности ios и сохранение его
Ссылка-2: Снимки экрана из приложения iOS - эмуляция Дисплей рекордера (запрос на внутреннем устройстве)

(Ссылка Ссылка-1) У меня есть код для снятия скриншотов в фоновом режиме. Но, как уже говорилось, для непрерывной работы требуется 2 секунды бездействия, в противном случае ОС приостанавливает работу приложения. Я выяснил причину, может быть, я не выпускаю явно IOSurface, который я создаю.
Причина - Используя ссылку http://pastie.org/pastes/3734430 данную Виктором Ронином, захват работает отлично даже без сна. Я попытался выпустить destSurf (созданную мной поверхность назначения) с использованием CFRelease после того, как я каждый раз записываю изображение, но это не работает.

Любая помощь, когда, как и нужно ли выпускать созданную IOSurface, будет действительно полезна. Благодарю.

Обновить
Итак, именно это и происходит. (Ссылка на ссылку-1)

IOSurfaceRef destSurf = IOSurfaceCreate(dict);
IOSurfaceAcceleratorRef outAcc;
IOSurfaceAcceleratorCreate(NULL, 0, &outAcc);

CFDictionaryRef ed = (__bridge CFDictionaryRef)[NSDictionary dictionaryWithObjectsAndKeys: nil];
IOSurfaceAcceleratorTransferSurface(outAcc, screenSurface, destSurf, ed, NULL);

IOSurfaceUnlock(screenSurface, kIOSurfaceLockReadOnly, &aseed);

CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, IOSurfaceGetBaseAddress(destSurf), (width*height*4), NULL);
CGImageRef cgImage=CGImageCreate(width, height, 8, 8*4, IOSurfaceGetBytesPerRow(destSurf), CGColorSpaceCreateDeviceRGB(), kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder32Little, provider, NULL, YES, kCGRenderingIntentDefault);
UIImage *image = [UIImage imageWithCGImage: cgImage];
CGImageRelease(cgImage);
UIImageWriteToSavedPhotosAlbum(image, self, nil, nil);
CFRelease(destSurf);
  1. Происходит вызов CFRelease, и приложение вылетает. Нет сохраненных изображений. Тем не менее, если вы положите в сон на 1-2 секунды до выпуска, он работает нормально.
  2. Если вы пропустите вызов UIImageWriteToSavePhotosAlbum(), все работает нормально, и захват происходит без прерывания.
    Мне до сих пор не ясно, в чем именно заключается проблема и как ее решить. Любая помощь высоко ценится.

1 ответ

Я думаю, вам нужно освободить поверхность. Он создается с помощью API IOSurfaceCreate, который не управляется автоматическими выпусками.

В качестве примера я нашел следующий код, где он выпущен:

https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=8&cad=rja&ved=0CF0QFjAH&url=http%3A%2F%2Fcode.google.com%2Fp%2Fsyphon-framework%2Fsource%2Fbrowse%2Ftags%2Fpublic-beta-1%2FSyphonServer.m%3Fr%3D3&ei=i_zRUMWQDMqw0AHs7IHYDA&usg=AFQjCNG9yO3sUf-ZQy-W_h_Q9WJMm4hqgw

http://www.opensource.apple.com/source/WebCore/WebCore-7536.24/platform/graphics/surfaces/mac/GraphicsSurfaceMac.cpp?txt

Что произойдет, если вы попытаетесь выпустить его с помощью CFRelease? Это происходит сбой или у него та же проблема с 2 секундами?

Другие вопросы по тегам