我们项目最近在支持 iOS 120FPS 高刷新率模式。因此打开了以下几个开关:
- [/Script/IOSRuntimeSettings.IOSRuntimeSettings] 中配置 FrameRateLock=PUFRL_None
- [/Script/IOSRuntimeSettings.IOSRuntimeSettings] 中配置 bEnableDynamicMaxFPS=True
- Plist 中设置 CADisableMinimumFrameDurationOnPhone=YES
- 运行时设置 t.MaxFPS=120 以及 r.SetFramePace=120
使用以上配置,通过 Xcode 的 Performance Graph 以及游戏内日志,可以确认游戏线程、渲染线程和渲染提交帧率均达到了 120FPS,但我们发现 FIOSView::touchesMoved 回调仍然以 16ms 左右的频率更新,因此游戏接受的滑动输入仍是 60FPS 的。
<br/>
这个问题最初在 4.26 发现,但 5.6 仍然存在相同的问题。使用最简单的空工程即可复现,我们确认 touchesMoved 时间间隔的方法是通过日志输出确认的。目前也尝试了使用原生 Object-C 和 Swift 测试工程在相同机器上测试,在设置 MKTView.paused=true 后,UIViewController 上的 touchesMoved 回调可以达到 8ms 的更新频率。
<br/>
想请问这个问题该如何解决?或者我们应该如何修改代码,获得正确的效果?
Liu.Wei
(Liu.Wei)
2
Hi,
感谢提供信息,我暂时也没有想法,我已经在咨询苹果的开发工程师,看看他们那边有什么建议。貌似UIView上没有类似MKTView.paused的功能。后续如果有反馈,我会再这里更新。
Hi,
感谢回复,这里补充说明一下。我们用原生工程测试的时候,发现如果 MTKView.paused=false 也就是默认状态下,可以复现我们所遇到的情况,即渲染 120FPS 输入事件 60FPS。但因为 UE 没有直接使用 MTKView,我们看不到源码也不能确定 MTKView.paused 的实际作用。这个现象仅供参考,不一定有关联,但如果以此类推的话,我们怀疑是可能 FIOSView 有其他的事件驱动逻辑,和 CADisplayLink 有冲突才导致这个问题
Liu.Wei
(Liu.Wei)
4
Hi,
不知道你们这个问题是否有进展,苹果工程师的意思好像是runloop的工作要跑在主线程,我不太确定是不是要注掉 [NSThread detachNewThreadSelector:@selector(run:) toTarget:FramePacer withObject:nil];,然后让[FramePacer run]运行在engine tick里?
Hi,
是的,CADisplayLink 需要使用 mainThread 的 runloop 才行。我们改成用 performSelectorOnMainThread 调起 [FramePacer run] 就能解决这个问题了