GodotVR / godot_oculus_mobile

Godot Oculus mobile drivers (Oculus Go / Oculus Quest)
MIT License
170 stars 34 forks source link

Perceivable lag in oculus quest tracking #46

Closed NeoSpark314 closed 5 years ago

NeoSpark314 commented 5 years ago

There is a perceivable lag in tracking that seems not related to rendering performance.

The easiest reproducer for me is to have a simple unlit cube attached to the ARVRCcontroller and wave it in front of the eye. Then change to oculus home and do the same with the controller; the oculus home controller matches much better the hand movement. Both applications have swap interval and extra latency mode set to 1. FPS is constant 72 according to the OVR Metrics tool.

reproducer_tracking_latency.zip Screenshot from 2019-09-01 19-16-03

I will try to look into this more deeply but any idea, hint or trick that could help me trace and debug this would be great.

I have two theories at the moment that I would use as starting point: A) It has to do sth. with the framebuffer swapping and there is maybe some additional buffering along the way to the OVR compositor B) or it comes from how the tracking positions are handled on the way to godot for rendering that could introduce the visible lag.

m4gr3d commented 5 years ago

Have you tried setting the extra latency mode to 0 and see its effect on tracking performance as well?

NeoSpark314 commented 5 years ago

Just tried it; hard to tell with my simple test case if it improves with VRAPI_EXTRA_LATENCY_MODE_OFF ovr ON.. it still feels not as snappy as the oculus home controller tracking when switching back and forth (oculus home has extra latency activated according to OVR Metrics tool). Do you have an Idea on how to better test/debug this? The first time I noticed this was actually when I tested a small project (that ran perfectly smooth at 72 hz) and after 5min I got sick... which never happened to me with other quest apps so far even after >1hour...

NeoSpark314 commented 5 years ago

I think I found at least one Issue with the controller tracking: https://github.com/GodotVR/godot_oculus_mobile/blob/36393808d159bb7e0a495f7038b0f67790702aa3/src/ovr_mobile_controller.cpp#L147 passes 0.0 as predicted display time instead of the value that is queried here https://github.com/GodotVR/godot_oculus_mobile/blob/36393808d159bb7e0a495f7038b0f67790702aa3/src/ovr_mobile_session.cpp#L247

Passing this value on significantly improves the situation for the controller.