石英性能绘图大缓冲区

时间:2012-02-24 21:37:55

标签: ios performance xamarin.ios quartz-graphics quartz-2d

我想知道我正在尝试的是一个坏主意。我现在正在做单调。是否有可能将屏幕大小(在我的iPhone 4上大约320x460)缓冲区绘制到相同大小的UIView上足够快,以便对该缓冲区的动画更改看起来平滑到最终用户(每次绘制需要大约20ms)

我尝试了很多不同的实现。到目前为止,最好的一个似乎是使用内存中的CGLayer并调用context.DrawLayer()将其应用于Draw()内部的视图。但即便如此,每个DrawLayer需要30-40ms。

我正在编写自己的图像控件,除了性能之外,这个想法运作良好。我只是无法弄清楚如何足够快地将缓冲区放到UIView上。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我最近一直在处理自定义视图,而且我也遇到了很多性能问题。

所有这些性能问题都可以通过确定需要重绘的元素来解决,更重要的是,的元素需要重新绘制。

然后,将图层中的内容拆分为单个子图层,并在必要时仅重绘它们。好消息是,动画等对于那些单独的层来说非常流畅。 (他们的内容只是一个简单的位图,在你说出来之前不会改变。)

我遇到的唯一限制是,您不能对子图层使用CG混合模式(例如乘法)。据我所知,这是不可能的。您只能在用于绘制子图层内容的CG代码中使用这些混合模式,但之后它们都以“正常”模式组成。

答案 1 :(得分:1)

这取决于你画的是什么。

如果您只是绘制一个实心填充颜色,那应该不是问题。问题是你正在改变多少表面,以及你如何改变它。

同样,这取决于您的绘图以及是否可以将部分工作卸载到GPU。例如,如果你的界面的静态部分保持不变,或者是独立的动画/更新,你可以为这些区域使用不同的层,让GPU组成这些。

图层的优势在于它们由GPU合成,并且它们由自己的位图支持。一旦绘制到图层的表面,操作系统就会将结果缓存在GPU中并同时组合所有图层。

然后,您可以确定应用程序的哪些部分实际需要重绘,并且只在每个帧上重绘这些部分。

但同样,它实际上将取决于你想要做的事情。