From 22d3d65ed536ceed221b594f14fac71b4161d490 Mon Sep 17 00:00:00 2001 From: Riccardo Zaglia Date: Fri, 17 Jan 2025 22:31:28 +0100 Subject: [PATCH] Add Max prediction setting --- alvr/client_core/src/connection.rs | 2 ++ alvr/client_core/src/lib.rs | 8 ++++---- alvr/session/src/settings.rs | 8 ++++++++ 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/alvr/client_core/src/connection.rs b/alvr/client_core/src/connection.rs index 8050cac1fd..3c3e8db1a9 100644 --- a/alvr/client_core/src/connection.rs +++ b/alvr/client_core/src/connection.rs @@ -70,6 +70,7 @@ pub struct ConnectionContext { pub view_params: RwLock<[ViewParams; 2]>, pub uses_multimodal_protocol: RelaxedAtomic, pub velocities_multiplier: RwLock, + pub max_prediction: RwLock, } fn set_hud_message(event_queue: &Mutex>, message: &str) { @@ -205,6 +206,7 @@ fn connection_pipeline( let negotiated_config = stream_config.negotiated_config; *ctx.velocities_multiplier.write() = settings.extra.velocities_multiplier; + *ctx.max_prediction.write() = Duration::from_millis(settings.headset.max_prediction_ms); *ctx.statistics_manager.lock() = Some(StatisticsManager::new( settings.connection.statistics_history_size, diff --git a/alvr/client_core/src/lib.rs b/alvr/client_core/src/lib.rs index 106adc3f24..81d4fbd3fc 100644 --- a/alvr/client_core/src/lib.rs +++ b/alvr/client_core/src/lib.rs @@ -42,8 +42,6 @@ use storage::Config; pub use alvr_system_info::Platform; pub use logging_backend::init_logging; -pub const MAX_PREDICTION: Duration = Duration::from_millis(100); - pub enum ClientCoreEvent { UpdateHudMessage(String), StreamingStarted(Box), @@ -236,10 +234,12 @@ impl ClientCoreContext { ) { dbg_client_core!("send_tracking"); + let max_prediction = *self.connection_context.max_prediction.read(); + let target_timestamp = if let Some(stats) = &*self.connection_context.statistics_manager.lock() { - poll_timestamp + Duration::max(stats.average_total_pipeline_latency(), MAX_PREDICTION) + poll_timestamp + Duration::max(stats.average_total_pipeline_latency(), max_prediction) } else { poll_timestamp }; @@ -266,7 +266,7 @@ impl ClientCoreContext { motion.angular_velocity = Vec3::ZERO; } else if let Some(stats) = &*self.connection_context.statistics_manager.lock() { let tracker_timestamp = poll_timestamp - + Duration::max(stats.tracker_prediction_offset(), MAX_PREDICTION); + + Duration::max(stats.tracker_prediction_offset(), max_prediction); *motion = motion.predict(poll_timestamp, tracker_timestamp); } diff --git a/alvr/session/src/settings.rs b/alvr/session/src/settings.rs index 5dc39959ff..2447bb4859 100644 --- a/alvr/session/src/settings.rs +++ b/alvr/session/src/settings.rs @@ -1109,6 +1109,13 @@ Tilted: the world gets tilted when long pressing the oculus button. This is usef #[schema(flag = "steamvr-restart")] #[schema(strings(display_name = "VMC"))] pub vmc: Switch, + + #[schema(strings( + help = "Maximum prediction for head and controllers. Used to avoid too much jitter during loading." + ))] + #[schema(flag = "real-time")] + #[schema(gui(slider(min = 0, max = 500, step = 10)), suffix = "ms")] + pub max_prediction_ms: u64, } #[derive(SettingsSchema, Serialize, Deserialize, Clone, Copy)] @@ -1823,6 +1830,7 @@ pub fn session_settings_default() -> SettingsDefault { rotation_recentering_mode: RotationRecenteringModeDefault { variant: RotationRecenteringModeDefaultVariant::Yaw, }, + max_prediction_ms: 100, }, connection: ConnectionConfigDefault { stream_protocol: SocketProtocolDefault {