Мне нужна помощь по оптимизации блинга BGR888 для NSView
Это лучшее, что я придумала для создания 24-битного изображения BGR в NSView.
Я сократил значительное количество процессорного времени, убедившись, что хост NSWindow также имеет такое же цветовое пространство.
Я думаю, что здесь происходит 4 или 5 пикселей копии:
- в
vImage
преобразование (обязательно) - призвание
CGDataProviderCreateWithData
- призвание
CGImageCreate
- создавая
NSBitmapImageRep
битовая карта - в финале с
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;
}
}
1 ответ
Используйте CGColorSpaceCreateDeviceRGB вместо genericRGB, чтобы избежать преобразования цветового пространства внутри CG. Используйте kCGImageAlphaNoneSkipLast вместо kCGImageAlphaLast, поскольку мы знаем, что альфа непрозрачна, чтобы разрешить копирование вместо наложения.
После того, как вы внесете эти изменения, было бы полезно запустить на нем временной профиль, чтобы показать, куда идет время.