2012-02-24 55 views
0

我想知道我正在尝试的只是一个坏主意。我目前正在单点触摸。是否可以将屏幕大小(在我的iPhone 4上大约为320x460)的缓冲区绘制到大小相等的UIView上,以便对最终用户来说,对该缓冲区的动画更改看起来很流畅(需要每个绘图大约20ms) 。石英性能绘图大缓冲区

我已经尝试许多不同的实现。迄今为止最好的一个似乎是使用内存中的CGLayer并调用context.DrawLayer()将其应用于Draw()中的视图。但即使这样,每个DrawLayer也需要30-40毫秒。

我在写我自己瓦片图像控制,并且除了性能,这个想法运作良好。我只是不知道如何快速将缓冲区放到UIView上。

任何想法?

回答

1

我一直在处理自定义视图很多最近,我已经有一堆的性能问题,太。

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

然后,在层为单独的子层分割的内容,如果需要只重绘它们。好处是,对于这些单独的图层,动画等非常流畅。 (他们的内容只是一个简单的位图,直到你告诉它才会改变)。

唯一的限制我都已经跨越了,你不能使用CG混合模式(例如乘)的子层。据我所知,这是不可能的。您只能在用于绘制子图层内容的CG代码内部使用这些混合模式,但在此之后它们都是在“正常”模式下编写的。

+0

唯一棘手的部分是,我需要的缓冲区不断地更新。我一直在装载新的图像切片(认为是Google地图),所以缓冲区变化很大。 – Aaron 2012-02-27 16:27:24

+0

我明白了......我很抱歉,我无法真正帮助你解决这个问题。另一个想法:你的图层是否比屏幕大得多?在我的例子中,这是一个巨大的性能...另外:你确定绘图例程是慢的部分吗? (而不是代码加载瓷砖?) – 2012-02-28 11:50:30

+0

我想我已经找到了一个很好的平衡,通过使用CALayers和加载新的缓冲区时,用户停止移动的东西。看起来好像将位图绘制到上下文始终是瓶颈。 – Aaron 2012-02-29 23:18:37

1

这真的取决于你是画什么。

如果你只是画一个实心填充颜色,这不应该是一个问题。问题是你有多大的表面变化,以及你如何改变它。

再次,它取决于你画什么,你是否可以卸载一些工作交给GPU的。例如,如果您的界面的静态部分保持不变,或者独立进行动画/更新,则可以对这些区域使用不同的图层,并让GPU组成这些图层。

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

然后你就可以判断这实际上需要你的应用程序的部分重新绘制和重绘每帧的那些部分。

但同样,它真的将取决于很多关于你正在尝试做的。

+0

这是我一直在采取的方法。问题是我的图层需要不断更新。我正在尝试实现类似于Google地图的外观。我还没有想出如何获得该层/缓冲区来保持更新并保持性能。如果它保持不变,那么我没有问题。 – Aaron 2012-02-27 16:26:29