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时,它会再次平稳运行.

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

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...