简单的绘画:
指法iPhone屏幕绘制临时图形,以一个UIView。 的触摸结束之后,这些临时的图形都被擦除,并且然后被存储到下面的UIView。
这个过程很简单:
1)触摸启动及动向>>
2)油漆在上面的UIView临时图形>>
3)触摸结束>>
4)通临时图形底层的UIView >>
5)标的的UIView增加了临时图形来存储的图形>>
6)相关资产的UIView重新绘制所有存储的图形>>
7)删除顶部的UIView临时图形。
通过这种方式,我可以在底层的UIView积累的图形,同时保持在顶部的UIView临时图形的响应画。
(旁注:每个“绘图”是简单地定制“点”的对象,其只是NSObject的容器CGPoints的一个NSArray和底层的UIView具有一个单独的NSArray,其中存储CGPoints这些NSArrays。)
问题是:
当显卡大量堆积在底层的UIView,它需要时间来绘制所有在屏幕上。 而在顶部的UIView任何新的图纸将不被显示,直到底层存储图形的绘制完成。 因此,当许多图形是屏幕上的一个明显的滞后。
题:
谁能想到在这里提高性能的好办法,以便有图纸之间没有noticable滞后时,也有很多在屏幕上的图形?
CGPoints的一个NSArray? 你的意思是抱着CGPoints NSValues的一个NSArray? 这是持有什么必须是你经常访问值的数量庞大的一个令人难以置信的时间,昂贵的方式。 你可以存储在很多更好的方法此信息。 表示整个画面A 2维C-阵列是最明显的。 您可能还需要寻找到的位图图像表示,并直接拉进一个CGImage,而不是维持一堆CGPoints的。 看看在石英2D编程指南 。
编辑:
你的对象(下图)是一个相当于NSValue
,只是有点更加专业化。 有很多的开销会在这里当你有很多很多的对象(〜100000我猜当屏幕几乎满;更多,如果你不删除重复;运行仪器来分析的话)。 旧式的C数据结构很可能是这个快很多,因为你能避免所有的保留/释放,分配,等等还有其他的选择,虽然。 重复点检查将有更快NSMutableSet
如果像素对齐您CGPoints和超载-isEqual
贵点的对象。
请确保你的像素排列数据。 借鉴分数像素(和存储他们所有的),可以显着提高参与对象的数量和绘图你正在做的量。 即使你想抗锯齿,至少一轮的像素为0.5(或0.25或东西 )。 一个CGPoint由两个双打。 你不需要那种精密吸取到屏幕上。
为什么不画都到CGBitmapContextRef
缓冲所以绘图操作将积累,然后绘制到屏幕在您drawRect:
您将能够在不减慢随着业务的总数增加执行任意图形操作。
如果撤消支持是必要的,一个总是可以保留一份副本每次对其进行更改,并在接收到内存警告无效时,最旧的副本。 (或为更丰富的解决方案,存储操作,你现在要做的,但要保持缓存副本每十用户操作左右)