在遇到性能问题之前,iOS 上可以同时显示多少个 UIView?

Posted

技术标签:

【中文标题】在遇到性能问题之前,iOS 上可以同时显示多少个 UIView?【英文标题】:How many UIViews can be displayed simultaneously on iOS before running into performance problems? 【发布时间】:2010-12-21 20:02:49 【问题描述】:

我正在制作一个 iPhone 游戏并使用UIView 对象来绘制精灵。大多数时候,我没有性能问题。但是,一旦屏幕上有大约 15 到 20 个对象(其中可能有 5 个在四处移动),游戏就会变得相当慢,尤其是在 iPhone 3G 上。帧速率可降至每秒一帧。

这仅仅是使用UIView 对象的限制,还是ios 应该能够同时处理屏幕上的这么多UIView 对象?

为了隔离问题,我将视图的绘制变得非常简单——绘制一个红色矩形。 drawRect 每个视图只被调用一次。视图层次结构非常简单和浅薄。我正在使用CADisplayLink 更新每一帧的UIView 位置。

几乎没有其他事情发生,所以我想知道是否有其他人成功使用了这个数量的UIView 对象。

【问题讨论】:

【参考方案1】:

我的问题的关键在于我在游戏内容上贴了标签。标签不是不透明的,这可能是问题的很大一部分,正如 phix23 所建议的那样。

产生重大影响的第一件事是删除内容顶部的每秒帧数标签。拥有一个改变每一帧内容的标签会导致速度大大降低。

我还有一个大标签,它显示在游戏的大部分内容之上,并在你升级时改变形状。事实证明,在所有东西上绘制这个标签也会导致很多减速。

在回答我最初的问题时,我发现在 iPhone 3G 上,我可以同时在屏幕上支持大约 30-40 个不透明的 UIView,以及 2 或 3 个不透明的视图。改变大小、形状或位置的非透明 UIView 是迄今为止最糟糕的,即使其中一个覆盖大量屏幕也会很快导致问题。

【讨论】:

【参考方案2】:

如果您将每个视图的opaque 属性设置为NO,请记住这会严重影响绘制视图的速度。如果您的视图不透明,则应将此设置保留为 YES,这是默认设置。

【讨论】:

我很确定一切都将 opaque 设置为 YES,所以我认为这不是问题所在。虽然我听别人说不透明可以产生很大的不同,但在我自己的测试中,我没有看到不透明有任何明显的不同,所以我怀疑其他东西是瓶颈。【参考方案3】:

对于这种类型的应用程序,您应该使用 CoreGraphics / Quartz / OpenGL,但无论如何我认为这样的低数量没有限制。例如,如果我有一个包含 9 行的表视图,并且每行有 5 个子视图,它的显示速度仍然可以接受。您是否尝试过使用 UIView 动画来更改视图中的位置?

祝你学习 OpenGL 好运 ;)

【讨论】:

我认为情况确实如此,尽管我希望此时避免大修以更改绘图系统。 =/ 我曾尝试使用 UIView 动画,它似乎有所帮助,但有一些非常难以解决的限制,例如无法停止中间动画,以及无法访问插值的属性值。跨度> 但您可以将animationFromCurrentState设置为YES,它将从旧状态继续新动画 没错,但我还需要能够触摸 UIView 并让它在动画发生时做出响应。在 UIView 的动画期间,它不会在其当前动画位置响应,它会在其最终目的地响应触摸事件。

以上是关于在遇到性能问题之前,iOS 上可以同时显示多少个 UIView?的主要内容,如果未能解决你的问题,请参考以下文章

在性能下降之前,浏览器可以安全地处理多少个元素 ID?

减少图层数量(图层性能 15.4 )

Actionscript:在 iOS 上创建文本字段和填充的性能

iPad升级到iOS11可在屏幕上同时运行4个应用程序,你知道怎么做吗?

是否可以在丰富的通知 iOS swift 中同时显示图像和视频?

python同时打开几个程序默认运行哪一个