2014-02-09 82 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