0

我需要捕获桌面图像并处理其 RGB 数据,我正在使用 Quartz API 来做同样的事情,

我面临的问题是,高内存使用率,

请参考功能,

在此处编辑,此函数通过 pThread 调用;像这样的东西,

void ImageProcessing::thread(){  
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc]init];  
ImgRef sImageRef  

while( active){  
**strong text**
if ([currentWnd getCurrentRGBImage:&currentImg]){
   /*  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 中还是在我的代码中,

此外,这个函数正在消耗大量内存,如果我检查活动监视器,假设它真的在使用这么多内存是否安全?

4

1 回答 1

1

由于您不保留、创建或复制数据提供者,因此不应释放它。

我没有看到任何会导致过多内存消耗的东西,但是您遗漏了一些代码。

于 2013-01-08T18:14:31.720 回答