修复抖动和卡顿

什么是抖动和卡顿?

抖动(Jitter)和卡顿(stutter)是即使游戏在全速运行时,也可能出现在屏幕上物体可见运动中的两种不同变化,可能会影响游戏体验。这些问题在世界以恒定速度朝着固定方向运动的游戏中影响最明显, 比如跑酷或平台类游戏.

它们之间的区别

一款在正常帧下运行, 而不显示任何效果的游戏将显得平滑:

../../_images/motion_normal.gif

游戏展示了抖动将以非常细微的方式持续抖动:

../../_images/motion_jitter.gif

最后,存在“卡顿”的游戏看上去是流畅的,但似乎每隔几秒钟就会停顿回滚一帧

../../_images/motion_stutter.gif

抖动

产生抖动的原因有很多,最典型的情况发生在运行游戏时的物理频率(通常为 60 Hz)以与显示器刷新率不同。检查您的显示器刷新率是否为 60 Hz。

这通常不是一个问题, 因为大多数显示器都是60赫兹, 而且从Godot 3.1开始, 引入了一个帧定时器, 尽量与刷新同步.

有时只有一些对象会出现抖动(角色或背景)。当它们在不同的时间源中处理时,就会发生这种情况(一个在物理步骤中处理,另一个在空闲步骤中处理)。Godot 3.1 版本对此做了一些改进,从允许运动体在规则的 _process 循环中被动画化,进一步修正帧定时器。

备注

你可以使用物理插值来减少物理相关的抖动。请参阅 lawnjelly 的平滑插件,获得一个可以放入任何项目中以启用物理插值的附加组件。

卡顿

产生卡顿有两个不同原因。第一个,也是最明显的一个,就是游戏无法保持完整的帧率性能。解决方法是因游戏而异的,需要进行优化。

第二个原因更复杂,因为它通常与引擎或游戏无关,而与底层操作系统有关。下面是不同操作系统上,关于卡顿的一些信息。

Windows

众所周知,Windows 操作系统在窗口化游戏时会产生卡顿。这主要取决于您所安装的硬件,驱动程序版本和并行运行的进程(例如,打开多个浏览器标签页可能导致游戏在运行时出现卡顿)。为了避免这种情况,从 3.1 版本开始,Godot 将游戏的优先级提升到了“高于标准”。这样能够相当程度缓解问题,但可能无法完全消除卡顿现象。

完全消除这种情况需要给你的游戏以充分的权限, 使之成为 "time critical" , 这是不建议的. 有些游戏可能会这样做, 但建议学会忍受这个问题, 因为这对Windows游戏来说很常见, 而且大多数用户不会在窗口中玩游戏(反正在窗口中玩的游戏, 如益智游戏, 通常不会出现这个问题).

对于全屏来说,Windows 系统对游戏给予了特殊的优先级,所以卡顿现象不再可见,也非常罕见。大多数游戏都是这样玩的。

Linux(X11)

在 Linux 桌面系统上可以看到卡顿现象,这通常与不同的视频驱动程序和合成程序相关。Nouveau 驱动程序经常表现出这一点,而使用 AMD 和英伟达的驱动程序却不会出现。一些合成器程序也可能引发这个问题(例如 KWin),因此我们建议用另一种方法来排除其原因。

对于驱动程序或组合程序出现的卡顿现象,除了将其作为问题报告给驱动程序或组合程序开发人员外,没有其他解决办法。

macOS

通常情况下,macOS 不会出现卡顿现象,尽管最近在全屏运行时报告了一些 bug(这是 macOS 的 bug)。如果你的机器表现出这种行为,请将这问题提交给我们。

Android

通常情况下,Android 平台不会出现卡顿和抖动现象,因为运行活动拥有所有的优先级。也就是说,可能会出现问题的设备(较旧的 Kindle Fire 就是其中之一)。如果你在 Android 平台上看到这些问题,请将问题提交给我们。

iOS

iOS设备通常没有卡顿现象,但运行新版操作系统的旧式设备可能会出现问题。这通常是不可避免的。

报告卡顿或抖动问题

如果您报告的卡顿或抖动问题(提交 Issue)不是由上述原因引起的,请尽可能详细说明关于您的设备配置、操作系统、驱动程序版本等信息。这有助于我们更好地排除故障。

还要确保根据所展示的行为使用正确的术语(抖动或卡顿)。这有助于更快地理解您的问题。请提供可用来复现问题的项目,如果可能的话,还需要您提供一张屏幕截图来阐述这个 bug。