在遇到性能问题之前,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?的主要内容,如果未能解决你的问题,请参考以下文章
Actionscript:在 iOS 上创建文本字段和填充的性能
iPad升级到iOS11可在屏幕上同时运行4个应用程序,你知道怎么做吗?