Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

修復抖動、卡頓和輸入延遲

什麼是抖動、卡頓和輸入延遲?

*抖動*(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 的平滑外掛程式,可以將其新增到任何專案中以啟用物理插值。

卡頓

產生卡頓有兩個不同原因。第一個,也是最明顯的一個,就是遊戲無法保持完整的影格率性能。解決方法是因遊戲而異的,需要進行優化。

第二個原因更複雜,因為它通常與引擎或遊戲無關,而與底層作業系統有關。下面是不同作業系統上,關於卡頓的一些資訊。

在支援禁用垂直同步的平台上,透過在專案設定中停用垂直同步可以使卡頓現象變得不那麼明顯。然而,這會導致出現撕裂現象,尤其是在更新率較低的顯示器上。如果您的顯示器支援,請考慮啟用可變更新率(G-Sync/FreeSync),同時啟用垂直同步。這避免了減輕某些形式的口吃而不引起撕裂。

強制顯示卡使用最大效能設定檔也有助於減少卡頓,但代價是增加 GPU 功耗。

Windows

眾所周知,Windows 作業系統在視窗化遊戲時會產生卡頓。這主要取決於您所安裝的硬體,驅動程式版本和並行運作的程序(例如,打開多個瀏覽器標籤頁可能導致遊戲在運作時出現卡頓)。為了避免這種情況,從 3.1 版本開始,Godot 將遊戲的優先順序提升到了“高於標準”。這樣能夠相當程度緩解問題,但可能無法完全消除卡頓現象。

完全消除這種情況需要給你的遊戲以充分的許可權, 使之成為 "time critical" , 這是不建議的. 有些遊戲可能會這樣做, 但建議學會忍受這個問題, 因為這對Windows遊戲來說很常見, 而且大多數使用者不會在視窗中玩遊戲(反正在視窗中玩的遊戲, 如益智遊戲, 通常不會出現這個問題).

對於全屏來說,Windows 系統對遊戲給予了特殊的優先順序,所以卡頓現象不再可見,也非常罕見。大多數遊戲都是這樣玩的。

Linux

在 Linux 桌面系統上可以看到卡頓現象,這通常與不同的影片驅動程式和合成程式相關。Nouveau 驅動程式經常表現出這一點,而使用 AMD 和英偉達的驅動程式卻不會出現。一些合成器程式也可能引發這個問題(例如 KWin),因此我們建議用另一種方法來排除其原因。

There is no workaround for driver or compositor stuttering, other than reporting it as an issue to the driver or compositor developers. Stutter may be more present when playing in windowed mode as opposed to fullscreen, even with compositing disabled.

Feral GameMode 可用於在執行特定程序時自動套用最佳化(例如強制 GPU 效能設定檔)。

macOS

通常情況下,macOS 不會出現卡頓現象,儘管最近在全屏運作時報告了一些 bug(這是 macOS 的 bug)。如果你的機器表現出這種行為,請將這問題提交給我們。

Android

通常情況下,Android 平臺不會出現卡頓和抖動現象,因為運作活動擁有所有的優先順序。也就是說,可能會出現問題的裝置(較舊的 Kindle Fire 就是其中之一)。如果你在 Android 平臺上看到這些問題,請將問題提交給我們。

iOS

iOS裝置通常沒有卡頓現象,但運作新版作業系統的舊式裝置可能會出現問題。這通常是不可避免的。

輸入

組織專案

在支援停用垂直同步的平台上,透過在專案設定中停用垂直同步可以使輸入延遲變得不那麼明顯。然而,這會導致出現撕裂現象,尤其是在更新率較低的顯示器上。

增加每秒物理迭代的數量也可以減少物理引起的輸入延遲。當使用物理插值(提高平滑度但增加延遲)時,這一點尤其明顯。為此,請將**Physics > Common >Physics Ticks Per Second** 設定為高於預設「60」的值,或在腳本執行時設定「Engine.physical_ticks_per_second」。當停用物理內插時,顯示器更新率的倍數(通常為「60」)的值效果最佳,因為它們可以避免抖動。這意味著「120」、「180」和「240」等值是很好的起點。作為獎勵,更高的物理 FPS 使得隧道效應和物理不穩定問題不太可能發生。

提高實體 FPS 的缺點是 CPU 使用率會增加,這可能會導致具有大量實體模擬程式碼的遊戲出現效能瓶頸。僅在低延遲至關重要的情況下增加物理 FPS,或者讓玩家調整物理 FPS 以配對他們的硬件,可以緩解這一問題。然而,不同的物理 FPS 會導致物理模擬中不同的結果,即使在遊戲邏輯中一致使用「delta」時也是如此。這可以讓某些玩家比其他玩家更有優勢。因此,對於競技性多人遊戲,應避免允許玩家自行更改實體 FPS 。

最後,您可以透過在腳本中呼叫「Input.set_use_accumulated_input(false)」來在每個渲染影格的基礎上停用輸入緩衝。這將使腳本中的 _input() 和 _unhandled_input() 函式在每個輸入上被呼叫,而不是累積輸入並等待渲染影格。停用輸入累積會增加 CPU 使用率,因此應謹慎操作。

針對硬體/作業系統

如果您的顯示器支援,請考慮啟用可變更新率(G-Sync/FreeSync),同時啟用垂直同步,然後將專案設定中的影格速率限制為略低於顯示器最大更新率的值,如下所示: https://blurbusters.com/howto-low-lag-vsync-on/>`__。例如,在 144 Hz 顯示器上,您可以將專案的影格速率上限設定為「141」。起初這可能違反直覺,但將 FPS 限制在最大更新率範圍以下可確保作業系統永遠不必等待垂直消隱完成。這會導致與停用垂直同步相同的影格速率上限(通常大不到 1 毫秒)的「類似」輸入延遲,但不會出現任何撕裂。

這可以透過變更 Application > Run > Max FPS 專案設定或在執行時間在腳本中指派「Engine.max_fps」來完成。

在某些平台上,您也可以在圖形驅動程式選項中選擇低延遲模式(例如 Windows 上的 NVIDIA 控制台)。 Ultra 設定將為您提供盡可能低的延遲,但代價是平均影格速率略低。強制 GPU 使用最大效能設定檔還可以進一步減少輸入延遲,但代價是更高的功耗(以及由此產生的熱量/風扇噪音)。

最後,確保您的顯示器在作業系統的顯示設定中以盡可能高的更新率運作。

另外,請確保您的滑鼠配置為使用最高輪詢率(遊戲滑鼠通常為 1,000 Hz,有時更高)。然而,高 USB 輪詢率可能會導致 CPU 使用率高,因此對於低階 CPU,500 Hz 可能是更安全的選擇。如果您的滑鼠提供多種 DPI(每英吋點數)設定,也請考慮「使用盡可能高的設定並降低遊戲中的靈敏度以減少滑鼠延遲 <https://www.youtube.com/watch?v = 6AoRfv9W110>`__。

在 Linux 上,在允許合成的視窗管理器(例如 KWin 或 Xfwm)中停用合成可以顯著減少輸入延遲。

報告卡頓、抖動或輸入延遲問題

如果您報告的卡頓或抖動問題(提交 Issue)不是由上述原因引起的,請盡可能詳細說明關於您的裝置配置、作業系統、驅動程式版本等資訊。這有助於我們更好地排除故障。

如果您回報輸入延遲問題,請附上使用高速相機(例如手機的慢動作影片模式)拍攝的影像。擷取**必須**使螢幕和輸入裝置都可見,以便可以計算輸入和螢幕結果之間的影格數。另外,請務必提及顯示器的更新率和輸入裝置的輪詢率(尤其是滑鼠)。

還要確保根據所展示的行為使用正確的術語(抖動或卡頓)。這有助於更快地理解您的問題。請提供可用來複現問題的專案,如果可能的話,還需要您提供一張螢幕截圖來闡述這個 bug。