在我的iOS应用程序中,我创建了一个视图,用于在绘制时使用UIBezierPath
实时绘制用手指绘制的路径。不幸的是,由于路径变长(几百个顶点),我遇到了性能问题,每次刷新视图时绘制整个路径都变得不切实际。
我尝试将路径分成许多不同的片段,这样我只能在drawRect:
中绘制传递给我的矩形片段,这有很大帮助,但绘制仍然很慢;当将部分添加到已包含部分路径的屏幕区域中的路径时,会不必要地重绘许多段。
我不从视图中删除任何内容,因此我尝试启用clearsContextBeforeDrawing
并且每次调用drawRect:
时仅绘制最新的段,但似乎有大量的轶事证据网上暗示这个属性没有做任何事情,我似乎也无法使它工作。
加快绘图的最佳方法是什么?
从我所看到的,看起来我最好的选择是绘制到(屏幕外)位图上下文,所以我可以一点一点地添加并将其复制到屏幕上显示的图形上下文,但我也读到了在分配上下文时,以及在将图像渲染到屏幕时所需的RGBA到RGB转换时,这通常很慢。
看起来我可以做一些涉及CALayer
的事情(有或没有屏幕外缓冲区) - 我不清楚如何在一个图层上绘图,以及它是否会绕过任何问题我'见过。 contents
属性接受CGImageRef
;我可以制作CGImage
,然后逐步更新 而不重新绘制所有内容吗?另外,是否可以在不重绘整个内容的情况下添加到CALayer的内容中?
非常感谢任何见解。
编辑:对于赏金,请提供一个示例,说明如何正确初始化图像缓冲区,在其上绘制一个三次贝塞尔曲线路径,并将其适当地复制到屏幕上。另请注意使用您的方法的原因 - 我不知道使用CGBitmapContextCreate
是最好的方式还是我应该使用的其他方法。
答案 0 :(得分:1)
BezierPaths很好,因为它们是矢量,无论你的视图分辨率如何,它们都会很好看。但是,如果您不需要调整视图大小,则无需每次都计算所有内容。只需计算最后一个弧/线并将其绘制到上一个(屏幕外)缓冲区,这样可以提高性能。
我记得做过这样的事情并且性能并不是我在iPhone 3GS中以12fps左右达到的大问题。哪个不是那么糟糕。 (我没有使用bezier路径,我正在使用CGImageRefs和原始rgba缓冲区进行一些图像处理,这应该是这种方法中最昂贵的部分。只计算BezierPath的一个弧/线是非常便宜的)