如何提高 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
来说太大了(CALayer
s 被限制为 2048 x 2048 的最大 OpenGL 纹理大小),因此您可能需要将其分解为图块。
否则,正如@iolo 所说,您应该确保只重绘视图中真正需要更新的部分。
【讨论】:
以上是关于如何提高 CGContextFillRect 和 CGContextDrawImage 性能的主要内容,如果未能解决你的问题,请参考以下文章