2014-07-09 25 views
0

這是最好的,我想出了一個24位BGR圖像傳輸到NSView。我需要幫助優化BGR888傳輸到NSView

我確實通過確保NSWindow主機也具有相同的顏色空間來修剪了大量的CPU時間。

我認爲有4個或5個像素副本怎麼回事:在vImage轉換(必填)

  • 調用CGDataProviderCreateWithData
  • 調用CGImageCreate
  • 創建NSBitmapImageRep
    1. drawInRect(必填)

    任何人都想要改進它?

    任何幫助將不勝感激。

    { 
        // one-time setup code 
        CGColorSpaceRef useColorSpace = nil; 
        int w = 1920; 
        int h = 1080; 
        [theWindow setColorSpace: [NSColorSpace genericRGBColorSpace]]; 
        // setup vImage buffers (not listed here) 
        // srcBuffer is my 24-bit BGR image (malloc-ed to be w*h*3) 
        // dstBuffer is for the resulting 32-bit RGBA image (malloc-ed to be w*h*4) 
    
        ... 
        // this is called @ 30-60fps 
        if (!useColorSpace) 
         useColorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); 
        vImage_Error err = vImageConvert_BGR888toRGBA8888(srcBuffer, NULL, 0xff, dstBuffer, NO, 0); 
    
        CGDataProviderRef newProvider = CGDataProviderCreateWithData(NULL,dstBuffer->data,w*h*4,myReleaseProvider); 
        CGImageRef myImageRGBA = CGImageCreate(w, h, 8, 32, w*4, useColorSpace, kCGBitmapByteOrderDefault | kCGImageAlphaLast, newProvider, NULL, false, kCGRenderingIntentDefault); 
        CGDataProviderRelease(newProvider); 
        // store myImageRGBA in an array of frames (using NSObject wrappers) for later access (setNeedsDisplay:) 
        ... 
    } 
    
    - (void)drawRect:(NSRect)dirtyRect 
    { 
        // this is called @ 30-60fps 
        CGImageRef storedImage = ...; // retrieve from array 
        NSBitmapImageRep *repImg = [[NSBitmapImageRep alloc] initWithCGImage:storedImage]; 
        CGRect myFrame = CGRectMake(0,0,CGImageGetWidth(storedImage),CGImageGetHeight(storedImage)); 
        [repImg drawInRect:myFrame fromRect:myFrame operation:NSCompositeCopy fraction:1.0 respectFlipped:TRUE hints:nil]; 
    
        // free image from array (not listed here) 
    } 
    
    // this is called when the CGDataProvider is ready to release its data 
    void myReleaseProvider (void *info, const void *data, size_t size) 
    { 
        if (data) { 
         free((void *)data); 
         data=nil; 
        } 
    } 
    
  • 回答

    2

    使用CGColorSpaceCreateDeviceRGB而不是genericRGB來避免CG內部的顏色空間轉換。使用kCGImageAlphaNoneSkipLast代替kCGImageAlphaLast,因爲我們知道alpha是不透明的,以允許複製而不是混合。

    做出這些更改後,在其上運行儀器時間配置文件以顯示時間正在進行將很有用。