Quick answer: Physics runs at a fixed 60 ticks per second while frames render at the display rate. An object moved in _physics_process() and a camera moved in _process() (or a 144 Hz monitor) disagree about where things are each frame, which looks like jitter. Turn on physics interpolation, or keep everything that moves together in the same callback.
The game is smooth at 60 Hz and stutters at 144 Hz, or the player looks fine but the background shudders when the camera follows. That pattern is almost always a mismatch between the physics tick and the render frame.
What is going on
_physics_process(delta) runs a fixed number of times per second (60 by default). _process(delta) runs once per rendered frame. On a 144 Hz display, some frames happen between two physics ticks and some frames get two ticks. A body moved only on ticks therefore advances unevenly per frame, and anything moved per frame (such as a camera following it) amplifies the difference.
Rule of thumb
- Move physics bodies (CharacterBody, RigidBody) in
_physics_process(). - Move purely visual things (UI, particles, decorative tweens) in
_process(). - Never split one moving thing across both, for example the player in physics and the camera that follows it in process, unless interpolation is on.
Fix 1: enable physics interpolation
Godot 4.3 added physics interpolation for 2D and Godot 4.4 added it for 3D. It renders bodies smoothly between their last two physics positions:
Project Settings > Physics > Common > Physics Interpolation = On.
After enabling it, call reset_physics_interpolation() whenever you teleport something, or it will visibly slide from its old position:
func respawn():
global_position = spawn_point
reset_physics_interpolation()
Fix 2: put the camera on the same clock
Without interpolation, make the camera update at the same rate as its target. For Camera2D, set Process Callback to Physics. For a custom follow script, move the camera in _physics_process() too.
Fix 3: always scale by delta
Hard-coded per-frame movement runs at different speeds on different machines and stutters when frame times vary:
# frame-rate dependent
position.x += 4
# correct
position.x += speed * delta
Fix 4: check for real frame drops
If the Debugger's Monitors tab shows frame time spikes, the stutter is a performance problem, not timing. Look at the Profiler for scripts, shader compilation on first use, or loading on the main thread.
Quick test
Set Physics Ticks Per Second to 144 temporarily. If the jitter disappears on a 144 Hz monitor, the cause is the tick/frame mismatch and interpolation is the right fix — not a permanently higher tick rate.