优化大量 UIImageView

Posted

技术标签:

【中文标题】优化大量 UIImageView【英文标题】:Optimization lot of UIImageView 【发布时间】:2015-08-13 18:24:43 【问题描述】:

我遇到了一个优化问题。我必须在屏幕上同时显示很多图像(最多 150 个)。这些图像的显示就像是一个可以滚动的球体。

到目前为止,它在新设备上运行 60 fps,但有一些微滞后,我不知道是什么原因。分析器告诉我 59-60 fps,但问题是丢失的 fps 是可见的,并且像微信号一样下降。 如果我大幅减少 imageViews 的数量,这个问题就会消失。 它似乎不受 gpu 限制,因为我最多使用 30% 的 gpu,但 cpu 也从未超过 50%。

什么可能导致这种情况/我如何检测这种微滞后的原因? (图像以 contentOfFile 初始化) 知道至少一半图像不在屏幕上(球体的另一侧),提高性能的最佳解决方案是什么?

-回收 UIImageViews

-将不显示 imageView 设置为隐藏(这是我现在正在做的)

-使用光栅化层(但由于大小每次都在变化,它会重新渲染,对吧?)

-另一个我不知道的神奇解决方案。

如果您想试用该应用程序: https://itunes.apple.com/us/app/oolala-instant-hangout-app/id972713282?mt=8

【问题讨论】:

【参考方案1】:

1) 创建这些形状的方式也很重要。最高效的方法(据我所知)是使用 Alpha 通道预渲染图像。

2) 还有一个“经典”jpeg decompression problem

3) 我们直接使用 CALayer 在 iPhone 4S 屏幕上的 UIScrollView 中渲染约 300 张图像,而不会丢帧。可以试一试。

_layer = [CALayer new];
_layer.contents = (id)_image.CGImage;
_layer.opaque = _opaque;
_layer.contentsScale = [UIScreen mainScreen].scale;

这是很久以前的事了,在 ios 5 上使用过。除非你有快速的测试方法,否则你应该忽略这个建议。

【讨论】:

它已经预渲染了,比添加蒙版要好得多,就像你说的那样。我要试试。您的方法是否提供比 UIImageView 更好的性能?如果是这样,我想知道为什么。 > 你的方法是否比 UIImageView 提供更好的性能? 我已经更新了我的问题。 CALayer 用于提高 NIAttributedLabel 性能。它比 CGContextDrawImage 带来了巨大的性能提升。现在我开始怀疑它是否比 UIImageView 更快,但我相信我们也测试了 UIImageView。 我发现了问题,不是微滞后,而是惯性算法的问题。经过几次测试,我可以说屏幕上有 400 张图像,与 alpha 通道图像没有明显区别。但我仍然在 60 fps 上,所以它不可靠。既然你似乎对此了解很多,我的(低)open gl 技能告诉我,2 纹理的 pow 更容易为 gpu 计算,是真的吗? 大概,当 iOS 想要渲染图像位图时,它会将其加载到 OpenGL 纹理中。然后 OpenGL 将使用某种插值算法来计算每个片段(像素)的颜色,以填充构成图像视图的多边形。如果您的纹理(图像)大小与图像视图大小完全匹配,则不需要插值。 OpenGL 允许您手动更改插值算法。我不知道 iOS 是否利用了这一点;或者 OpenGL 是否会自动为您优化。

以上是关于优化大量 UIImageView的主要内容,如果未能解决你的问题,请参考以下文章

优化了MYSQL大量写入问题,老板奖励了1000块给我

如何优化具有大量聚合的查询

优化大量 UIImageView

优化大量列上的不同值

针对大量小文件优化 S3 下载

SQL Server性能优化删除大量数据的方法比较