在Retina显示屏上加载许多具有透明度的大型PNG

时间:2012-08-24 00:27:30

标签: ios ipad png transparency

我正在制作多达五个大型UIViews; UIViews是屏幕的全高,很多倍。每个图层以不同的速度滚动,但它们都包含可回收的UIImageViews的平铺集合。

我不断发现每个视图的哪个部分在屏幕上,并且异步地将可见的图块加载到UIImages中,然后将图像设置到主线程上的UIImageView中。 (为此使用NSOperation。)

我得到了它在iPad 2上非常流畅的地步。然后我抓住了iPad 3并将其插入,性能非常糟糕。在我滚动的整个过程中,我得到轻微的打嗝或全停止延迟。

我认为这是由于在视网膜显示屏上进行了大量的α混合造成的。

我尝试了CATiledLayer,并修复了滚动动作打嗝,但是平铺加载速度很慢。 (每次新图像完全加载时我都会调用setNeedsDisplay,但仍然很慢。)

我只发现了三个似乎对性能有帮助的变化:

  1. 我的UIViews曾经被切成一行,有很多列:每列的宽度是设备的整个高度128点。我将图像分成两行:顶行128x512点,底行128x256点。 (因为我总是风景和iPad专用。)

  2. 确保只有完全透明像素的瓷砖为零,因此它们无助于混合。

  3. 减少了分层UIViews的数量。还减小了滚动视图的大小,换句话说,只将加载的图块放入屏幕的顶部2/3。

  4. 第2点和第3点有效,因为它们会减少应用程序执行混合操作所需的像素总数。

    但问题是,他们是妥协。我不想在iPad2上工作如此通宵时必须像这样开始妥协。

    所以我的问题是:我有什么办法可以改善图像的混合性能吗?我想留在OpenGL之外,如果我去OpenGL它将是一个完整的重写,并且代码在UIKit中更快地融合在一起,而且它使用UIScrollView更好 - 因为滚动是一种噱头有了这个,保持UIScrollView的原生行为会很棒。

    所以我希望有一些我不知道的东西可以让PNG透明度神奇地融合得更快,或者还有其他方法可以在iPad 3上优化这个过程。谢谢!

0 个答案:

没有答案