在寫一個2D平臺跳躍的游戲代碼發現,移動的時候會抖動卡頓的厲害,后來研究了一下抖動問題,有了幾種解決方案
1.垂直同步和物理插值問題?
這是最常見的可能導致畫面撕裂和抖動的原因,大家可以根據自己的需要調整項目設置,選擇開啟關閉垂直同步和物理插值,以及設置抖動修復的值
2.2D像素吸附
這個常見于2D像素游戲,大家可以設置 項目設置-渲染-2D?,開啟像素吸附的選項來修復
3.坐標圓整(避免亞像素)
我們可以使用 Position = Position.Round(); 代碼進行圓整(如果有需要的話),可以對其像素、處理坐標或者避免模糊
4.相機跟隨抖動
這是我實際碰到的,因為我的人物移動邏輯寫在了_PhysicsProcess函數內,而相機自帶的Smooth平滑是寫在Process函數里的,所以不一致導致了抖動,我們根據自己的需要,專門給相機寫一個跟隨代碼,放在_PhysicsProcess函數即可
using Godot;
using System;public partial class Camera : Camera2D
{[Export] public float SmoothingSpeed;private CharacterBody2D PlayerTarget;public override void _Ready(){PlayerTarget = GetNode<CharacterBody2D>("../Player"); //獲取同級的玩家節點}public override void _PhysicsProcess(double delta){Vector2 Target = PlayerTarget.GlobalPosition;GlobalPosition = GlobalPosition.Lerp(Target, (float)(SmoothingSpeed * delta));//這里我使用的是Lerp,如果數值太大跟不上,可以考慮使用MoveToward}
}
這是我的相機代碼,大家可以根據自己的需要來修改
5.重力代碼引起的抖動 ?
這個抖動的原因在于編寫玩家重力代碼的時候,沒有加上地面判斷,所以玩家在地面上移動的時候就會上下抖動,解決辦法就是加上地面判斷,在地面上就不觸發重力代碼
private void PlayerGravity(float delta)
{if (IsOnFloor()) return; //判斷是否在地面Velocity = new Vector2(Velocity.X, Velocity.Y + _gravity * delta); //重力代碼
}
6.動畫Sprite錨點
這個抖動的原因在于Sprite2D 或 AnimatedSprite2D 的中心錨點不一致、幀之間圖片大小不一致、或播放動畫時存在偏移,會導致視覺上“閃爍”或“抖動”,解決方案就是保證尺寸一致,然后統一對齊錨點