2014-07-09 11 views
0

이것은 24 비트 BGR 이미지를 NSView에 블리 팅하기위한 것입니다.NSView에 BGR888 블리 팅을 최적화하는 데 도움이 필요합니다.

NSWindow 호스트의 colorSpace가 동일하게 유지되도록하여 상당량의 CPU 시간을 줄였습니다.

  1. NSBitmapImageRep 비트 맵
  2. 을 만드는 CGImageCreate
  3. 를 호출
  4. CGDataProviderCreateWithData
  5. 를 호출 (필수) vImage 전환 :

    나는 여기에 무슨 4 개, 5 픽셀의 사본이 있다고 생각 최종 블리트에서 drawInRect (필수)

누구나 그것을 개선하고 싶습니다.

도움을 주시면 감사하겠습니다. 대신 genericRGB의

{ 
    // 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는 CG 내부 색 공간 변환을 방지 할 수 있습니다. 블렌드 대신 복사본을 허용하기 위해 알파가 불투명하다는 것을 알기 때문에 kCGImageAlphaLast 대신 kCGImageAlphaNoneSkipLast를 사용하십시오.

변경 한 후에는 시간의 위치를 ​​표시하기 위해 Instruments 시간 프로필을 실행하는 것이 유용합니다.