【发布时间】:2014-01-20 19:11:56
【问题描述】:
我正在为 iOS 制作一个游戏,你主要在屏幕上拖动大对象。当我每隔 5 分钟左右在实际的 iPad/iPhone 上运行游戏一段时间(在屏幕上连续拖动对象)时,拖动的对象会卡顿大约 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 中的时间,完全在统一之外。
【问题讨论】:
-
touchedMoved:在主线程的运行循环中执行。我会使用工具来采样您的应用程序在此期间在主线程上所做的事情,以验证您的应用程序在这些期间没有表现出不同的行为并在主线程上更频繁地执行代码或阻塞。你在用锁吗?
标签: ios cocoa-touch unity3d timing touchesmoved