2014-02-09 79 views
0

我想弄清楚为什么argb32_image_mark_rgb24占用Mac FreeRDP客户端的整个执行时间的25%。这个函数是从CGContextDrawImage中调用的,这个函数在我的drawRect方法中调用。在drawRect中的代码如下所示:CoreGraphics argb32_image_mark_rgb24很慢

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

将整个屏幕像素从一种格式转换为另一种格式的每一帧肯定会吸收一些CPU。

虽然我对目标上下文是24位有点惊讶。从那时起,我已经有一段时间了,但在我的日子里,最后的屏幕通常是32位,8位只是被忽略了,但在那里是笑。

如果您记录深度和颜色通道以及所有的graphicsPort,您会看到什么?

你在一个奇怪的窗口?这是什么硬件?

你可以在OpenGL中完成一些技巧,你可以在这里填充纹理,然后将其渲染到屏幕上,但是又要确保像素格式与OpenGL本身可以做到的相匹配。我的理解是,它可以处理一些非常时髦的格式,但它是一个超快速路径。

也许退房CGLTexImageIOSurface2D()IOSurfaceRef。有一些example code here