游戏全速运行,画面却卡顿
任天堂 DS 的 3D 游戏即使以正常速度运行,画面仍会卡顿。1.5.0 为每一帧确定显示时间,让画面一张一张均匀地显示。
玩任天堂 DS 的 3D 游戏时,有时游戏速度没变,画面却一卡一卡的。游戏以正常速度生成帧,但其中约三分之一没有显示到画面上。
为了找出卡顿发生在哪里,制作了帧率显示。第一行是游戏每秒生成的帧数和相对实机的速度,第二行是画面上新显示的帧数和画面刷新次数。如果第一行是正常速度、只有第二行偏低,问题就在画面而不在游戏。可在暂停菜单的“画面”中开启或关闭。
DS 游戏常常每秒绘制 30 次 3D,重帧与轻帧交替出现,于是两帧几乎同时完成。画面每次刷新都取最新的一帧,因此几乎同时完成的两帧中,前一帧没能显示就被跳过了。
现在为每一帧确定显示到画面上的时间,也就是游戏原本应输出该帧的时间加上一小段等待时间。最多保留 4 帧,画面每次刷新时,显示已到显示时间的帧中最新的一帧。同时完成的两帧也会各自按顺序一张一张显示。
等待时间起初以大多数帧完成的时间为准,后来改为最近 2 秒内最晚完成的那一帧。但当慢帧离开这个时间范围时,等待时间会缩短,导致跳过其他帧。现在只要帧完成的延迟超过当前等待时间,就立即增加等待时间并保持。只有在缩短 1 帧的等待时间后仍能让所有帧按时显示的状态持续 30 秒,才会缩短这 1 帧。等待时间最多为 2 帧。即使画面稍晚显示,也选择减少卡顿。
iOS 和 Android 都用这种方式选择要显示的帧。游戏机的运行周期与屏幕刷新周期相差不超过 1.2% 时,会将游戏运行速度与屏幕刷新周期对齐,声音播放速度也按相同比例调整。在 iOS 上,DS 的 3D 画面也改在与游戏运行不同的线程中绘制,并在构建 DS 核心时开启链接时优化(LTO)。
在实机上只用一台 iPhone 确认过。在 Android 设备和其他游戏中能显示得多均匀,目前还没有测量。
相关开发故事
- 开发故事v1.3.0封闭 Beta 测试
用预运行让按键反应更快
游戏读取按键后,要过一帧以上才会把结果画到画面上。预运行会提前运行这些帧,让反应更快,但计算量增加,也会更耗电。
- 开发故事v1.2.0封闭 Beta 测试
减少暂停画面的重复处理
画面静止时,绘制仍可能重复进行。1.2.0 区分了需要重绘的时机,并允许先试用设置再保存。