我试图弄清楚为什么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只占用一个矩形,而不是两个。
谢谢!
答案 0 :(得分:0)
每帧将整个像素屏幕从一种格式转换为另一种格式肯定会吸引一些CPU。
但是,我对目标上下文是24位感到有些惊讶。已经有一段时间了,因为我已经达到了这个水平,但是在我的日子里,最后的屏幕通常是32位,只有8位被忽略但是笑声。如果您记录深度和颜色通道以及graphicsPort
的所有通道,您看到了什么?
你可以在OpenGL中做一些技巧,你可以在其中填充纹理,然后将其反转到屏幕,但是,再次,你需要确保像素格式与OpenGL本身可以做的相匹配。我的理解是,它可以处理一些非常时髦的格式,而且它是一条超快的路径。
也许请查看CGLTexImageIOSurface2D()
和IOSurfaceRef
。有一些example code here。