4

我有一个UIView子类,我需要将UIImage. 根据您喜欢使用哪个系列的 API,有几种方法可以给这只猫剥皮,我对最快的感兴趣。会是UIImage'sdrawAtPoint还是drawRect? 或者也许是基于 C 的 CoreGraphics 例程,或者其他什么?如果它会使 blitting 更快,我对更改源图像数据格式没有任何疑虑。

为了描述我的情况,我的应用程序有 ~10 到 ~200 个小UIViews (64x64),其中的一个子集需要根据用户交互重新绘制。我当前的实现是对我的子类例程drawAtPoint内部的调用。如果你能想出更好的方法来处理这种情况,我会全神贯注(好吧,眼睛)。UIViewdrawRect

4

4 回答 4

3

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

于 2009-09-09T01:27:10.877 回答
2

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

于 2009-09-24T23:06:58.283 回答
1

由于 CALayer 轻巧且快速,我会尝试一下。

蒂埃里

于 2009-09-09T13:24:35.430 回答
1

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

于 2011-10-16T06:52:34.050 回答