逐渐增加到UIView

Sop*_*ert 7 performance cocoa-touch drawing calayer

在我的iOS应用程序中,我创建了一个视图,用于在绘制时UIBezierPath实时渲染用手指绘制的路径.不幸的是,当路径变长(几百个顶点)时,我遇到性能问题,每次刷新视图时绘制整个路径变得不切实际.

我尝试将路径分成许多不同的段,这使我只能绘制传递给我的矩形中的段,drawRect:这有助于显着,但绘制仍然很慢; 当将节添加到已包含路径部分的屏幕区域中的路径时,会不必要地重绘许多段.

我没有从视图中删除任何东西,所以我试图启用clearsContextBeforeDrawing并且每次drawRect:调用时只绘制最新的段,但似乎有大量的轶事证据在线表明这个属性没有做任何事情我也似乎根本无法使其发挥作用.

加速绘画的最佳方法是什么?

从我所看到的,看起来我最好的选择是绘制到(屏幕外)位图上下文,所以我可以一点一点地添加并将其复制到屏幕上显示的图形上下文,但我也读到这通常是在分配上下文时以及在将图像渲染到屏幕时所需的RGBA到RGB转换时都会减慢.

看起来我可以做一些涉及到的事情CALayer(有或没有屏幕外缓冲区) - 我不清楚如何在一个图层上绘图,以及它是否会绕过我所看到的任何问题.该contents属性接受一个CGImageRef; 我可以做一个CGImage然后更新增量不重绘一切?另外,是否可以在不重绘整个内容的情况下添加到CALayer的内容中?

任何见解将不胜感激.


编辑:对于赏金,请提供一个示例,说明如何正确初始化图像缓冲区,在其上绘制一个三次贝塞尔曲线路径,并将其适当地复制到屏幕上.另外请记下为什么要使用你的方法 - 我不知道使用CGBitmapContextCreate是否是最好的方法,或者我还应该使用其他东西.

nac*_*o4d 1

BezierPaths 很好,因为它们是矢量,无论视图的分辨率如何,它们看起来都会很好。但是,如果您不需要调整视图大小,则无需每次都计算所有内容。只需计算最后一条弧/线并将其绘制到前一个(屏幕外)缓冲区上,这应该会提高性能。

我记得做这类事情时,性能并不是什么大问题,我在 iPhone 3GS 上的帧速率约为 12fps。这还不错。(我并没有使用贝塞尔路径,而是使用 CGImageRefs 和原始 rgba 缓冲区进行一些图像处理,这应该是这种方法中最昂贵的部分。仅计算贝塞尔路径的一个弧线/直线非常便宜)