2011-06-13 74 views
7

在我的iOS应用程序中,我创建了一个视图,用于在绘制时实时绘制使用UIBezierPath的手指绘制的路径。不幸的是,由于路径变长(几百个顶点),我遇到了性能问题,并且每次刷新视图时绘制整个路径变得不切实际。递增添加到UIView

我试着将路径分成许多不同的片段,这允许我只画出在drawRect:中传递给我的矩形中的片段,这对显着帮助很大,但绘制仍然很慢;当部分添加到已包含部分路径的屏幕区域中的路径中时,许多分段不必要地重绘。

我不删除视图中任何东西,所以我试图让clearsContextBeforeDrawing和只画最新片段每次drawRect:被调用,但似乎有在网上暗示,这家酒店没有按”大量的轶事证据没有做任何事情,我也似乎无法让它工作。

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

从我读过的内容看,我的最佳选择是绘制到(离屏)位图上下文,因此我可以一点一点地添加并将其复制到屏幕上显示的图形上下文中,但我也阅读在分配上下文时以及在将图像渲染到屏幕时需要进行RGBA到RGB转换时,这通常很慢。

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

任何见解将不胜感激。


编辑:对于恩惠,请提供的如何正确地初始化图像缓冲器,绘制三次贝塞尔路径在其上的示例,并且将其复制到适当的屏幕。也请记下为什么要使用你的方法 - 我不知道如果使用CGBitmapContextCreate是最好的方式,或者如果有其他我应该使用的。

+0

(I'如果可能的话,我喜欢避免使用OpenGL ES,因为在我看来,添加相当多的实现复杂性,考虑到我对OpenGL没有什么了解。) – 2011-06-13 03:56:55

回答

1

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

我记得做了这样的事情和性能并不是一个很大的问题,我在iPhone 3GS的12fps左右。这并不坏。 (我并没有使用bezier路径,而是使用CGImageRefs和原始rgba缓冲区进行图像处理,这应该是此方法中最昂贵的部分。计算BezierPath中只有一条弧/线非常便宜)

+1

谢谢。您能否详细说明如何设置缓冲区以及如何将其复制到屏幕? (我对iOS编程和Core Graphics有点新鲜。) – 2011-06-14 22:02:18