我想弄清楚爲什麼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只需要一個矩形,而不是兩個。
謝謝!