什麼是以高幀率渲染和縮放圖像到表面的最快方法?快速替代drawInRect
我正在繪製(使用縮放)NSBitmapImageRep使用drawRect在〜30FPS,但它使用了大量的CPU。
示例代碼以30FPS設置在NSBitmapImageRep像素:
NSInteger x, y;
unsigned char *imgptr = nsBitmapImageRepObj.bitmapData;
unsigned char *ptr;
NSInteger rowBytes = nsBitmapImageRepObj.bytesPerRow;
for (y = 0; y < nsInputFrameRect.size.height; y++) {
ptr = imgptr + (y * rowBytes);
for (x = 0; x < nsInputFrameRect.size.width; x++) {
*ptr++ = 1; // R
*ptr++ = 2; // G
*ptr++ = 3; // B
}
}
[self setNeedsDisplay:YES];
平局發生在30FPS:
- (void)drawRect:(NSRect)pRect {
[NSGraphicsContext saveGraphicsState];
[nsBitmapImageRepObj drawInRect:pRect];
[NSGraphicsContext restoreGraphicsState];
} // end drawRect
drawInRect在NSBitmapImageRep使用了大量的CPU。以高幀率縮放和繪製圖像的最快方式是什麼?源圖像應該是可以直接設置像素的圖像。通過獲取一個bitmapData指針。
如果我將NSBitmapImageRep轉換爲CIImage並使用[ciImage drawInRect]進行繪製,則速度提高大約10%。如果我繪製到NSOpenGLView而不是NSView,它再次快10%,但scale/drawInRect仍佔用大量CPU時間。
您是否試圖根據公式爲每個像素着色?這種操作最適合GPU。根據你要做什麼,你的解決方案可以從OpenGL着色器到CoreImage甚至Quartz。 –
這是簡單的卡拉OK圖形,但它不是公式化的:我更新低分辨率的NSBitmapImageRep圖像,然後將該小圖像縮放到約30FPS的屏幕尺寸。在小型NSBitmapImageRep中設置像素速度非常快,但使用drawInRect將圖像正常放大到屏幕尺寸非常緩慢。升級CIImage會更快嗎?或者,當源圖像可以逐個像素地設置時,是否有一些縮放圖像的更快速的方法? – CocoaMug