Мне нужно захватить изображение рабочего стола и обработать его данные RGB, я использую Quartz API, чтобы сделать то же самое,
Проблема, с которой я сталкиваюсь, заключается в высоком использовании памяти,
пожалуйста, обратитесь к функции,
Редактировать здесь, эта функция вызывается через pThread ; что-то вроде этого,
void ImageProcessing::thread(){
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc]init];
ImgRef sImageRef
while( active){
**strong text**
if ([currentWnd getCurrentRGBImage:¤tImg]){
/* do something here */
}
}
[pool release];
}
-(bool)getCurrentRGBImage:(ImgRef *)pImgRef{
CGImageRef pCGImageRef;
pCGImageRef = [self getDesktopImage];
if ( !pCGImageRef ){
NSLog(@" got NULL Image ");
CGImageRelease(pCGImageRef);
pCGImageRef = NULL;
return NO;
}
// Create a bitmap rep from the image...
size_t width = CGImageGetWidth(pCGImageRef);
size_t height = CGImageGetHeight(pCGImageRef);
int bytesPerRow = CGImageGetBytesPerRow(pCGImageRef);
int bytesPerPixel = CGImageGetBitsPerPixel(pCGImageRef)/8;
CGDataProviderRef provider = CGImageGetDataProvider(pCGImageRef);
CFDataRef pData = CGDataProviderCopyData(provider);
const uint8_t* bytes = (const uint8_t *)CFDataGetBytePtr(pData);
/***** ------------- *********
Copy RAW Bytes to pImgRef
****************************/
CGDataProviderRelease(provider);
CFRelease(pData);
CGImageRelease(pCGImageRef);
pCGImageRef = NULL;
return YES;
}
и функция getDesktopImage
-(CGImageRef)getDesktopImage{
CGImageRef screenShot;
screenShot = CGWindowListCreateImage(CGRectInfinite, kCGWindowListOptionOnScreenOnly, kCGNullWindowID, kCGWindowImageDefault);
return screenShot;
}
Проблема в том, что в целом эта функция потребляет много памяти, * pImgRef имеет один и только один экземпляр, есть только пиксели, манипуляции RGB,
Использование памяти, я имею в виду Mac Activity Monitor, надежно ли это?
документ Документация для CGDataProviderRelease упоминается, что приложение должно сохранять и освобождать его, поэтому я вызываю CGDAtaProviderRelease, но получаю сообщение в консоли недостаточное значение счетчика ссылок malloc для перерыва в auto_refcount_underflow_error для отладки
Должен ли я не вызывать CGDataProviderRelease()? если я прокомментирую, я не получу это сообщение, поэтому не уверен, является ли это ошибкой в Quartz или в моем коде,
Кроме того, эта функция потребляет чертовски много памяти, если я проверю монитор активности, можно ли предположить, что она действительно использует так много памяти?