0

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

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

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

我认为问题开始于我从 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,......

4

1 回答 1

1

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

根据iOS 事件处理指南中的选择运动事件更新间隔部分,较大的间隔可以提高电池寿命。所以我实现了一些逻辑来在游戏不活跃时将频率减慢到 2Hz,即游戏结束、暂停、主菜单……当恢复游戏时,频率再次设置为 60Hz。

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

于 2013-08-26T08:59:30.197 回答