Hello, im new here, and ive been doing my scene setup on windows, but yesterday i wanted to debug something else and booted up the project on linux and lo and behold, noticed something is not right.
The simple character setup jitters like mob on black friday.
Godot 4.5 dev2 dev5 and beta2 same problem
Windows
Lunix
One thing to note that on windows i have 60hz monitors and on lunix i was working on 144hz monitor.
Has anyone encountered such thing?
P.S. i didnt record the screen but when i was testing on lunix, the raycast collision was jittery aswell even from moving mouse really slow and in straight line. But on windows as you can see its all smooth.
Lunix - AMD 7900xtx
Binbows - Nvidia 4070s
I tried one other project from 4.2 /4.3 also converted it to the 4.5 and no problem there.. Im not sure how to debug it more..
WHat i noticed on linux that the collision shape capsule was trying to rotate during input lets sey i press left and it should go left and rotate the mesh in that direction relative to camera view. And it did that, maybe overshot the exact 90deg and the stuttered back a little, over shot that compensation and rinse and repeat. It was not as smooth as on windows.
P.S.S
Also the video recording is lower much lower framerate (i was too lazy to mess with settings and learn how to record at higher) but the jittery was super fast to the point it was ghosting like 10px offset from character mesh, real fast jitter. On video you see slower jitter but it still therer.
As for character controller, there is nothig fancy.


func _physics_process(delta: float) -> void:
# Add the gravity.
if not is_on_floor():
velocity += get_gravity() * delta
# Handle jump.
if Input.is_action_just_pressed("action_jump") and (is_on_floor() || (!coyote_timer.is_stopped() || jump_count < MAX_JUMP_COUNT ) ):
velocity.y = JUMP_VELOCITY
jump_count +=1
input_dir = Input.get_vector("action_move_left", "action_move_right", "action_move_forward", "action_move_backward")
direction = (player_camera.transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()
#direction = (transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()
#direction = direction.rotated(Vector3.UP,player_camera.rotation.y)
if is_on_floor():
if direction:
#direction = direction.rotated(Vector3.UP,player_camera.rotation.y)
if is_sprinting:
move(sprint_speed,acceleration,delta)
#velocity.x = lerp(velocity.x,direction.x * sprint_speed,delta * acceleration)
#velocity.z = lerp(velocity.z,direction.z * sprint_speed,delta * acceleration)
else:
move(speed,acceleration,delta)
#velocity.x = lerp(velocity.x,direction.x * speed,delta * acceleration)
#velocity.z = lerp(velocity.z,direction.z * speed,delta * acceleration)
rotation.y=lerp_angle(rotation.y,atan2(-velocity.x,-velocity.z),0.2)
else:
if is_sprinting:
velocity.x = move_toward(velocity.x, 0, sprint_speed)
velocity.z = move_toward(velocity.z, 0, sprint_speed)
else:
velocity.x = move_toward(velocity.x, 0, speed)
velocity.z = move_toward(velocity.z, 0, speed)
else:
if direction:
velocity.x = lerp(velocity.x,direction.x * speed,delta * acceleration)
velocity.z = lerp(velocity.z,direction.z * speed,delta * acceleration)
rotation.y=lerp_angle(rotation.y,atan2(-velocity.x,-velocity.z),0.2)
else:
velocity.x = lerp(velocity.x, 0.0, delta * speed * 0.1)
velocity.z = lerp(velocity.z, 0.0, delta * speed * 0.1)
var was_on_floor = is_on_floor()
move_and_slide()
if was_on_floor && !is_on_floor():
coyote_timer.start()
if is_on_floor() and jump_count !=0:
jump_count = 0