Quick answer: Project Settings → Physics → Common → Physics Interpolation = on. Update the camera in _process, not _physics_process. Read the character’s interpolated global_position. Jitter disappears on high-refresh displays.

Player runs across the screen. On a 60 Hz display: smooth. On a 144 Hz display: stuttering. The character is stepping at 60 Hz physics; the camera renders at 144. Interpolation is the bridge between the two rates.

The Symptom

On a high-refresh display, the player’s sprite shows obvious stutter even though FPS is high. Camera follows perfectly — both move together but both look jittery. On a 60 Hz display the issue disappears.

What Causes This

By default, Godot runs physics at 60 Hz. CharacterBody/RigidBody update positions on the physics tick. Render frames between ticks (e.g. 1.4 frames per tick at 84 Hz vs 60 Hz physics) show the character at the same position twice, then jump. Without interpolation, the camera following the character also locks to the 60 Hz cadence.

The Fix

Step 1: Enable physics interpolation. Project Settings → Physics → Common → Physics Interpolation. On. Restart the project.

This makes Godot interpolate Node2D/Node3D positions of physics-driven nodes between physics ticks for rendering.

Step 2: Camera in _process, not _physics_process.

extends Camera2D

@export var target: Node2D
@export var follow_speed := 8.0

func _process(delta: float) -> void:
    if target == null: return
    var target_pos = target.global_position
    global_position = global_position.lerp(target_pos, follow_speed * delta)

Reading target.global_position in _process with interpolation enabled returns the interpolated value, sampled at the current render frame’s temporal position. Smooth at any refresh rate.

Step 3: Disable interpolation per-node where unwanted. For nodes that should snap (a teleporting boss, a respawning player), call node.reset_physics_interpolation() right after the snap to skip the interpolation for one frame.

RigidBody Caveat

RigidBody2D/3D respect physics interpolation automatically. CharacterBody also does. Custom Node2D nodes you move manually in _physics_process need explicit interpolation control via the physics_interpolation_mode property.

Determinism

Physics interpolation is purely visual; the simulation is unchanged. Networked games still tick deterministically at the configured rate; only the rendered transform interpolates.

Verifying

Run on a high-refresh monitor (or set V-Sync off and watch FPS > 60). Move the player. The sprite should glide; the camera should glide. Without interpolation: visible stair-stepping.

Or temporarily set physics/common/physics_ticks_per_second = 30. With interpolation, the game still looks smooth at 144 Hz. Without, it looks like stop-motion.

“Interpolation on. Camera in _process. Read interpolated transforms. The high-refresh stutter goes away.”

Related Issues

For Godot frame pacing, see frame pacing. For camera shake jitter, see camera shake.

Interpolation. _process for camera. Smooth at 144Hz.