【问题标题】:Optimization lot of UIImageView优化大量 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

【问题讨论】:

    标签: ios optimization uiimageview uiimage uikit


    【解决方案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 是否会自动为您优化。
    猜你喜欢
    • 2012-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    • 2011-03-18
    相关资源
    最近更新 更多