【问题标题】:Improve transparent image drawing performance提高透明图像绘制性能
【发布时间】:2011-08-04 13:33:58
【问题描述】:

我的目标 我想通过使用图像之外的背景在动画期间没有变化的事实来提高动画中透明图像的绘制性能。

背景 我需要构建一个包含 100 张图像(约 5 秒)的动画。我不能使用 UIImageView 的 startAnimating 函数,因为 100 张图片太大而无法放入内存。所以我决定使用计时器并直接更改 UIImageView 中的图像。问题是对于透明图像,绘制速度太慢(全屏透明图像为 5 FPS;不透明图像为 22 FPS)。

当动画启动时,我知道我的图像之外的像素在动画完成之前不会改变。

问题 有没有办法通过使用图像之外的背景在动画期间不改变的事实来提高我的透明图像的绘制性能?

请注意,在我启动动画之前,图像之外的背景可能会发生变化,因此我不能将背景直接放在我的图像中。

【问题讨论】:

  • 动画的像素大小是多少?
  • 我正在制作的动画是 424*678 像素。为什么 ?我可能在其他项目中也有全屏动画。
  • 我想过在纹理中添加所有帧,但它的大小对于您的动画大小来说会非常大。

标签: ios performance uiimageview transparency


【解决方案1】:

很遗憾,您的选择有限。因为您不提前知道背景——也就是说,在动画运行之前——所以在动画运行时需要在背景上合成透明图像。我认为没有办法解决这个问题。

您应该能够使用UIImageView-animationImages 功能,因为它不应该加载并将所有图像保存在内存中,而是在需要显示时加载它们。你有没有试过这个方法,如果有,结果如何?

我能想到的唯一其他选择是使用 OpenGL 纹理,可以使用使用较少内存的 PVRTC 压缩纹理,这样您就可以保持更多的加载,并避免在动画时由于图像解压缩而导致任何减速正在运行。

【讨论】:

  • 我已经尝试过 animationImages 但我有太多图像无法使用(大约 100 张图像)。我认为它会在您启动 startAnimating 时加载所有图像您有关于 PVRTC 的教程吗?
【解决方案2】:

您是否尝试过禁用 UIImageView 的透明度并将其背景设置为 [UIColor clearColor]?这应该会提高 UIView 的合成性能。

您还可以查看 CGLayers,而不是使用 UIImageView 并在后台线程中随时随地读取图像。这可能是 UIImageView 对动画图像所做的事情,但您应该能够以这种方式节省内存,因为您可以足够快地加载图像。

您是否受 I/O 或图形性能的限制?您可以尝试使用 NSData 在内存中加载 3 张图像,然后在屏幕上解压缩/显示它们,而无需敲击磁盘以了解这是否是您的瓶颈。您还可以尝试使用解压缩的内存图像来了解解压缩步骤是否是一个限制因素(您使用 PNG 而不是 JPEG 对吗?)。

【讨论】:

  • 好主意,但使图像不透明并不能解决问题。你能告诉我更多关于我可以用图层做什么来比 UIImageView 更快地绘制图像的信息吗?
  • 图层基本上是由 Core Animation 本地处理的 Open GL 纹理:这是在屏幕上显示内容的最快方式。如果您想节省内存,请专注于以足够快的速度从文件到图层以提供动画。
  • 谢谢。我明天试试你的建议。由于我的赏金将在此之前结束,因此我在不测试您的解决方案的情况下给您奖励。我希望你是对的 ;-)
  • 谢谢 :) 异步加载器代码不容易编写,但考虑到 iPad/iPhone 的图形功能,我猜 I/O 将成为您的瓶颈,这就是您必须要做的专心。
  • 好的,我已经测试了加载 NSData 中的所有内容,但它并没有解决问题。看来,瓶颈是PNG解压。我使用了这个:stackoverflow.com/questions/1815476/…,这使我的代码运行得非常快,但消耗了大量内存。现在我需要以一种智能的方式加载/卸载图像。
猜你喜欢
  • 2020-08-16
  • 2013-01-29
  • 1970-01-01
  • 2014-06-01
  • 2020-08-17
  • 1970-01-01
  • 2017-01-04
  • 1970-01-01
  • 2010-11-16
相关资源
最近更新 更多