一段时间后性能下降,尤其是在设备休息时

Posted

技术标签:

【中文标题】一段时间后性能下降,尤其是在设备休息时【英文标题】:Performance decreases after a while especially when device is resting 【发布时间】:2013-08-26 08:59:30 【问题描述】:

我有一个使用 Unity 游戏引擎和自写库来访问 Apple 的 Core Motion 框架的 iPhone 游戏。性能在 iPhone 5 上非常出色,过去在 iPhone 4 上性能还不错。

今天在 iPhone 4 (ios 6.1.3) 上运行我的应用程序会在一段时间后出现帧速率持续下降(5-10 分钟后明显)。大约 20 到 30 分钟后,游戏几乎无法玩,并且似乎以慢动作运行。

奇怪的是:特别是当设备静止在桌子上时,效果会发生。 当我移动设备时,帧率会明显上升,但在没有移动时会再次下降。我发现不是用 C#(Unity 游戏引擎)编写的游戏代码,而是 Obj-C 部分用于处理 Core Motion 的运动控制。

我认为问题开始于我从 iOS 5.1.x 更新到 iOS 6.1.3 的时间,但我不确定。很难确定问题开始的确切时间,因为我在精美的 iPhone 5 上进行了所有更长的测试,而在 iPhone 4 上进行了快速测试(好的,吸取了教训 ;-)。

我使用“旧式”拉取方法来获取 CMDeviceMotion 实例,即 startDeviceMotionUpdates 没有块处理程序。拉取代码在单独的线程中运行,结果证明这是最高效的方式 - 嗯,过去。

Unity 内置的 iOS 分析器(控制台)并没有显示出显着的内存消耗,但我认为本机代码插件在统计中没有考虑在内。据我所知,Xcode 分析器也没有显示任何泄漏。只是大量的内存分配和释放,这让我有点惊讶(我认为在轮询时在内部回收 CMDeviceMotion 实例可能会更快,但谁在乎)。


问题:这个星座在 iOS 6 上是否存在任何已知问题?我的意思是,拉动,在单独的线程中运行,60 Hz,结合 Unity 游戏引擎 + Open GL ES 2,...

【问题讨论】:

【参考方案1】:

终于找到了罪魁祸首:deviceMotionUpdateInterval 更准确地说,经常更改间隔

根据Choosing a Motion Event Update Interval in Event Handling Guide for iOS 部分,更大的间隔可以提高电池寿命。所以我实现了一些逻辑来在游戏不活跃时将频率降低到 2Hz,即游戏结束、暂停、主菜单……当恢复游戏时,频率再次设置为 60Hz。

将更改频率的代码注释掉后,问题就消失了。所以我决定不再尝试以这种方式节省电池消耗。

【讨论】:

以上是关于一段时间后性能下降,尤其是在设备休息时的主要内容,如果未能解决你的问题,请参考以下文章

iOS设备中的C++代码性能下降[关闭]

路由器刚连接网络时一切正常, 但是运行一-段时间之后, 网速就开始下降,甚至频频掉线,怎么弄

升级到 XCode 4.3 后 FPS 下降

电脑运行一段时间后性能开始下降是怎么回事?

如何在移动设备中测试我的应用程序的内存泄漏,尤其是在 iOS 和 Android 中? [关闭]

子资源完整性和性能