我有一款使用Unity游戏引擎和自编库的iPhone游戏来访问Apple的Core Motion框架。 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探测器也没有显示任何泄漏。只是大量的内存分配和deallocs,这对我来说有点令人惊讶(我认为在内部回收CMDeviceMotion实例可能会在轮询时更快,但是谁在乎)。
问题:iOS 6上有这个星座的任何已知问题吗?我的意思是,拉动,在单独的线程中运行,60赫兹,结合Unity游戏引擎+ Open GL ES 2,......
答案 0 :(得分:1)
最后我找到了罪魁祸首:deviceMotionUpdateInterval
更准确地说,经常改变间隔。
根据Choosing a Motion Event Update Interval in Event Handling Guide for iOS部分,更大的间隔会延长电池寿命。所以我实现了一些逻辑,当游戏不活跃时将频率减慢到2Hz,即游戏结束,暂停,主菜单......当恢复游戏时,频率再次设置为60 Hz。
在注释掉更改频率的代码后,问题就消失了。所以我决定不再尝试以这种方式节省电池消耗。