如何提高 CGContextFillRect 和 CGContextDrawImage 性能

Posted

技术标签:

【中文标题】如何提高 CGContextFillRect 和 CGContextDrawImage 性能【英文标题】:How can I improve CGContextFillRect and CGContextDrawImage performance 【发布时间】:2011-07-08 14:09:08 【问题描述】:

这两个功能目前是我的瓶颈。我正在处理非常大的位图。

我怎样才能提高他们的表现?

【问题讨论】:

你没有给我们太多的继续。请描述您正在绘制的内容、位图的大小以及您遇到的性能问题。还请发布任何相关的绘图代码。 我使用大小为 2930 x 5750 像素的位图(每个像素为 4 字节,RGBA)。我使用 CGContextFillRect (和之前的 CGContextSetRGBFillColor )用背景颜色填充位图。 【参考方案1】:

您可以缓存您在第一次绘制之前创建的位图的较小版本,然后简单地绘制缩小的样本,而不是完整的 15 兆像素的东西。

然后再次确保您只绘制必要的内容,即在“drawRect: (NSRect) rect”中仅在矩形内绘制(除非绝对必要)。并尽量不要在该方法之外进行绘图。

【讨论】:

【参考方案2】:

如果您要绘制具有移动内容的前景的大型背景图像,请考虑使用支持图层的NSView,添加一个图层并设置其背景图像。然后,您可以在背景层上方的其他层(或支持层的NSViews)中绘制您的内容,并且视图将永远不需要重新绘制背景图像,因为它存储在 GPU 的纹理内存中。您当前的图像对于单个 CALayer 来说太大了(CALayers 被限制为 2048 x 2048 的最大 OpenGL 纹理大小),因此您可能需要将其分解为图块。

否则,正如@iolo 所说,您应该确保只重绘视图中真正需要更新的部分。

【讨论】:

以上是关于如何提高 CGContextFillRect 和 CGContextDrawImage 性能的主要内容,如果未能解决你的问题,请参考以下文章

画一个百分比的圆

UIView 填充颜色

如何提高MATLAB的运算速度

如何提高MATLAB的运算速度

如何提高UBOOT的启动速度

目前大一,在学C++,编程能力如何快速提高?