我正在创建最多五个大型 UIView;UIViews 是屏幕的整个高度,宽度是屏幕的许多倍。每一层都以不同的速度滚动,但它们都包含一个平铺的 UIImageView 集合,这些 UIImageView 被回收。
我一直在寻找每个视图的哪个部分在屏幕上,并将可见图块异步加载到 UIImages 中,然后将图像设置回主线程上的 UIImageView 中。(为此使用 NSOperation。)
我在 iPad 2 上达到了超级流畅的地步。然后我拿到了 iPad 3 并将其插入,性能很糟糕。在我滚动的整个过程中,我都会遇到轻微的打嗝或完全停止的延迟。
我认为这是由于在视网膜显示器上进行了大量的 alpha 混合造成的。
我尝试了 CATiledLayer,它修复了滚动运动打嗝,但瓷砖加载速度非常慢。(每次完全加载新图像时,我都会调用 setNeedsDisplay,但速度仍然很慢。)
我只发现了三个似乎有助于提高性能的变化:
我的 UIViews 曾经被切割成一行,有很多列:每列宽 128 点,按设备的全高计算。我将图像分成两行:顶行 128x512 点,底行 128x256 点。(因为我总是横向和仅 iPad。)
确保只有完全透明像素的图块为零,因此它们不会有助于混合。
减少了分层 UIView 的数量。还减小了滚动视图的大小,换句话说,仅将图块加载到屏幕的顶部 2/3。
第 2 点和第 3 点有效,因为它们减少了应用程序必须执行混合操作的像素总数。
但问题是,它们是妥协。当它在 iPad2 上运行得如此流畅时,我不想不得不像这样妥协。
所以我的问题是:我能做些什么来提高图像的混合性能吗?为此,我想留在 OpenGL 之外,如果我去 OpenGL,那将是一个完整的重写,并且代码在 UIKit 中的组合速度更快,而且它与 UIScrollView 一起玩得更好——因为滚动是一种噱头有了这个,保持 UIScrollView 的本机行为会很棒。
所以我希望有一些我不知道的东西可以让 PNG 透明度更快地神奇地混合,或者有一些其他方法可以优化 iPad 3 上的过程。谢谢!