简单绘画:
指纹iPhone屏幕为UIView绘制临时图形。触摸结束后,这些临时图形将被删除,然后存储到底层UIView中。
过程很简单:
1)触摸开始&移动>>
2)在顶部UIView上绘制临时图形>>
3)触摸结束>>
4)将临时图形传递给基础UIView>>
5)基础UIView将临时图形添加到存储图形>>
6)基础UIView重新绘制所有存储的图形>>
7)删除顶部UIView上的临时图形。
通过这种方式,我可以在底层UIView上累积图形,同时保持顶部UIView上的临时图形的响应性绘制。
(旁注:每个“绘图”只是一个自定义“点”对象的NSArray,它只是CGPoints的NSObject容器。而底层的UIView有一个单独的NSArray,它存储了这些CGPoints的NSArrays)
问题是:
当底层UIView上积累了大量图形时,需要花费时间在屏幕上绘制所有图形。在完成底层存储图形的绘制之前,顶部UIView上的任何新绘图都不会显示。因此,当屏幕上出现许多图形时,会出现明显的延迟。
问题:
任何人都可以想到一个提高性能的好方法,这样当屏幕上有很多图形时,图纸之间没有明显的延迟吗?
答案 0 :(得分:2)
CGPoints的NSArray?你的意思是NSValues持有CGPoints的NSArray?这是一种非常耗费时间的方式来保存您不断访问的大量值。您可以以更好的方式存储此信息。代表整个屏幕的二维C阵列是最明显的。您可能还想查看位图图像表示,并直接绘制到CGImage而不是维护一堆CGPoints。看看Quartz 2D Programming Guide。
编辑:
您的对象(下方)相当于NSValue
,只是更专业一点。当你有很多很多物体时,这里会有很多开销(当我的屏幕几乎已满时,我估计约为100,000;如果你没有删除重复数据,则更多;运行仪器来对其进行分析)。旧式C数据结构可能要快得多,因为您可以避免所有保留/释放,分配等。但是还有其他选择。如果您对CGPoints进行像素对齐,并在Point对象上重载NSMutableSet
,则使用-isEqual
进行重复点检查会更快。
确保您对数据进行像素对齐。使用小数像素(并将它们全部存储)绘制,可以显着增加所涉及的对象数量和您正在进行的绘制量。即使你想要抗锯齿,至少将像素舍入为.5(或.25或某些)。 CGPoint由两个双打组成。您不需要那种精确度来绘制到屏幕上。
答案 1 :(得分:1)
为什么不将所有内容都绘制到CGBitmapContextRef
缓冲区上,以便绘图操作会累积,然后将其绘制到drawRect:
的屏幕上?随着操作总数的增加,您将能够执行任意图形操作而不会减慢速度。
如果需要撤消支持,则可以始终为每个更改保留一份副本,并在收到内存警告时使最旧的副本无效。 (或者对于一个更加漂亮的解决方案,像现在一样存储操作,但是每十几个用户操作保留一个缓存副本)