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 は 1 つのインスタンスしか持たず、ピクセル、RGB 操作のみが存在します。

メモリ使用量 Mac アクティビティ モニターについて言及していますが、これは信頼できますか?

CGDataProviderReleaseのドキュメントドキュメントアプリケーションはそれの保持と解放を維持する必要があると記載されているため、CGDAtaProviderRelease を呼び出していますが、 デバッグするために auto_refcount_underflow_error でブレークするためのコンソール malloc 参照カウント アンダーフローでメッセージを取得しています

CGDataProviderRelease() を呼び出すべきではありませんか? コメントしても、このメッセージが表示されないので、Quartz のバグなのか、コードのバグなのかわかりません。

また、この関数は非常に多くのメモリを消費しています。Activity Monitor をチェックインすると、実際にこれほど多くのメモリを使用していると想定しても安全ですか?

4

1 に答える 1

1

データ プロバイダーは保持、作成、またはコピーしないため、解放しないでください。

過剰なメモリ消費の原因となるものは何も見当たりませんが、コードの一部が省略されています。

于 2013-01-08T18:14:31.720 に答える