微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ios – touchesMoved以不规则的间隔调用

我正在制作一款适用于iOS的游戏,您可以在屏幕上拖动大对象.当我在实际的iPad / iPhone上运行游戏一段时间(连续在屏幕上以圆圈拖动物体)时,每隔5分钟左右,被拖动的物体就会大约10-30秒.然后,它回到移动丝般光滑.

在视觉上,看起来游戏的帧速率在一段时间内降至15 fps,但事实上它一直以坚如磐石的60 fps运行.然而,我注意到唯一不能顺利移动的是被拖动的物体,而游戏的其余部分都运行得非常顺畅.

这让我相信口吃与iOS中的触摸输入有关.所以我开始查看touchesMoved,并且看到它通常每16毫秒调用一次(因此触摸输入以60 fps运行).到现在为止还挺好.

然后我注意到当对象开始出现口吃时,touchesMoved开始以奇怪的时间间隔被调用,在8毫秒到50毫秒之间波动.

因此,当触摸屏处于这种奇怪的状态时,有时touchesMoved将在前一次调用后的8毫秒内被调用,有时它将在前一次调用后50毫秒被调用.当然,这使得拖动的对象看起来都很不稳定,因为它的位置是以不规则的间隔更新的.

你有什么想法会导致touchesMoved停止被定期调用,就像通常那样吗?

奖金:

– 无论何时我倾斜屏幕以强制屏幕方向改变,大约70%的时间触摸屏进入上述状态,其中touchesMoved开始被不规则地调用.然后在10-20秒后它恢复正常,一切看起来都很平稳.

– 我已经在两台iPad和两台iPhone上试用了iOS 6和7,这个问题出现在所有这些设备上.

– OpenGLES视图用于显示图形.它使用CAdisplayLink与显示刷新率同步.

– 我用来测试这个的Xcode项目是由unity3d游戏开发工具生成的,但是我发现了几个出现同样问题的非统一游戏.这似乎是一个系统范围的问题.注意我正在使用CFAbsoluteTimeGetCurrent测量objective-c中的时间,完全在统一之外.

解决方法

这不是Unity中的错误.

操作系统内部的某些东西进入了不良状态,触摸拖动消息停止流畅.有时您会在一个框架中获得多个更新,有时您将无法获得任何更新.

iPhone4或更低版本不会发生此问题,或者游戏以30Hz帧速率运行.

我在使用我在以前的公司工作时写的内部引擎时遇到了这个错误.它首先在升级拼字游戏类型游戏的UI系统后表现出来,您可以在屏幕上拖动磁贴.这是完全奇怪的,我从来没有能够确定准确的再现步骤,但它们似乎与时间有关,不知何故.

它也可以在愤怒的小鸟(除非他们现在已经修复它)以及市场上的各种其他游戏中看到,基本上任何都有触摸拖动滚动或移动.对于愤怒的小鸟,只需进入一个级别并开始向侧面滚动.大多数时候它会如丝般顺滑,但也许十分之一,它会很笨重.重新启动应用程序,然后重试.

解决方法是将输入更新频率降低到30Hz几帧.这会以某种方式震动操作系统的内部结构并给它时间伸直自己,所以当你将其恢复到60Hz时,它会再次平稳运行.

每当您检测到输入了错误状态时,请执行此操作.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐