我需要捕获桌面图像并处理其RGB数据,我使用Quartz API来做同样的事情,
我面临的问题是,高mem使用率,
请参阅功能
在这里编辑, 这个函数是通过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,它可靠吗?
文档Documentation for CGDataProviderRelease提到应用程序需要保持保留和释放它,所以我调用CGDAtaProviderRelease但在控制台中获取消息 malloc引用计数下溢,用于中断auto_refcount_underflow_error以进行调试
我不应该调用CGDataProviderRelease()吗?如果我评论我没有得到这个消息,所以不确定,无论是在Quartz中还是在我的代码中的bug,
此外,这个功能正在消耗大量的内存,如果我在Activity监视器中检查,是否可以安全地假设它真的使用了这么多内存?
答案 0 :(得分:1)
由于您不保留,创建或复制数据提供者,因此不应将其发布。
我没有看到任何会导致内存消耗过多的内容,但是你留下了一些代码。