最快的iPhone Blit Routine?

时间:2009-09-08 22:41:17

标签: iphone drawing performance blit

我有一个UIView子类,我需要将UIImage加入blit。有几种方法可以根据你喜欢使用的API系列来修饰这只猫,我对它的兴趣最快。是UIImage drawAtPoint还是drawRect?或者也许是基于C的CoreGraphics例程,还是其他什么?我对改变源图像数据格式没有任何疑虑,如果它能使得blitting更快。

为了描述我的情况,我的应用程序有大约10到200个小UIView s(64x64),其中一部分需要根据用户交互重绘。我当前的实现是在drawAtPoint子类UIView例程中调用drawRect。如果你能想出一种更好的方法来处理这种情况,那我就是耳朵(好吧,眼睛)。

4 个答案:

答案 0 :(得分:3)

使用OpenGL视图可能是最快的。保留图像的年龄缓存(或者如果您知道更好的方法来确定何时可以从缓存中删除某些图像,请务必使用它)并在应用程序空闲时预加载尽可能多的图像。它应该非常快,几乎不涉及Objective-C调用(仅-draw

答案 1 :(得分:2)

虽然根本不是“blit”,但考虑到问题的要求(许多小图像有各种状态变化),我能够保持不同的状态在他们自己的单独的UIImageView实例中重绘,并且只是在给定状态变化的情况下显示/隐藏适当的实例。

答案 2 :(得分:1)

由于CALayer重量轻,速度快,我试试。

亨利

答案 3 :(得分:1)

您将要找到的最快的blit实现是在我的AVAnimator库中,它包含一个针对CoreGraphics缓冲区的blit的ARM asm实现,请查看源代码。您可以使用它的方式是创建单个图形上下文,整个屏幕的大小,然后将您的特定图像更改blit到此单个图形上下文中,然后从中创建一个UIImage并将其设置为一个UIImageView。这将涉及每次刷新1次GPU上传,因此它不会取决于您渲染到缓冲区的图像数量。但是,你可能不需要那么低的水平。您应首先尝试将每个64x64图像制作成CALayer,然后使用图像内容更新每个图层,图像的内容与图层64x64的大小完全相同。唯一棘手的是,如果它们来自PNG或JPEG文件,您将需要解压缩每个原始图像。您可以通过创建另一个像素缓冲区并将原始图像渲染到新的像素缓冲区来实现这一点,这样就可以在开始设置CALayer内容之前完成所有PNG或JPEG解压缩。