【发布时间】:2014-02-09 21:45:52
【问题描述】:
我试图弄清楚为什么 argb32_image_mark_rgb24 在 Mac FreeRDP 客户端中占用了大约 25% 的执行时间。这个函数是从 CGContextDrawImage 调用的,这是我在 drawRect 方法中调用的一个函数。 drawRect 代码如下所示:
CGContextRef cgContext = [[NSGraphicsContext currentContext] graphicsPort];
CGImageRef cgImage = CGBitmapContextCreateImage(self->bitmap_context);
CGContextClipToRect(cgContext, CGRectMake(rect.origin.x, rect.origin.y, rect.size.width, rect.size.height));
CGContextDrawImage(cgContext, CGRectMake(0, 0, [self bounds].size.width, [self bounds].size.height), cgImage);
CGImageRelease(cgImage);
位图上下文是这样创建的:
CGContextRef mac_create_bitmap_context(rdpContext* context)
{
CGContextRef bitmap_context;
rdpGdi* gdi = context->gdi;
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
if (gdi->dstBpp == 16)
{
bitmap_context = CGBitmapContextCreate(gdi->primary_buffer,
gdi->width, gdi->height, 5, gdi->width * 2, colorSpace,
kCGBitmapByteOrder16Little | kCGImageAlphaNoneSkipFirst);
}
else
{
bitmap_context = CGBitmapContextCreate(gdi->primary_buffer,
gdi->width, gdi->height, 8, gdi->width * 4, colorSpace,
kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipFirst);
}
CGColorSpaceRelease(colorSpace);
return bitmap_context;
}
gdi->primary_buffer 是渲染 RDP 绘图调用的软件缓冲区。目前,RDP 渲染库支持 RGB565、RGB555 和大多数 32bpp 变体。
根据我对 API 文档的理解,CGBitmapContextCreate() 创建了一个包装我的软件缓冲区的对象,但不会立即创建副本。像素的复制只会在调用 CGContextDrawImage() 时发生。
我想了解以下内容:
argb32_image_mark_rgb24 究竟是做什么的?它是否执行某种从 ARGB32 到 3 字节 RGB24 像素的转换?添加对 3 字节 RGB24 像素作为软件缓冲区格式的支持是否可以让我避免在这里发生的代价高昂的转换?
否则,我如何更改当前设置剪切矩形的调用,然后使用整个表面进行绘制以进行从源矩形复制到目标矩形的调用? CGContextDrawImage 只需要一个矩形,而不是两个。
谢谢!
【问题讨论】:
标签: macos core-graphics rdp