fps-stabilize openxr smoothing
This commit is contained in:
@@ -324,9 +324,8 @@ impl OpenXrHand {
|
|||||||
transmute::<Vector3f, Vec3>(location.pose.position),
|
transmute::<Vector3f, Vec3>(location.pose.position),
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
let lerp_factor = (1.0 / (xr.predicted_display_period.as_nanos() / 10_000_000) as f32
|
let lerp_factor =
|
||||||
* session.config.pointer_lerp_factor)
|
(1.0 / (xr.fps / 100.0) * session.config.pointer_lerp_factor).clamp(0.1, 1.0);
|
||||||
.clamp(0.1, 1.0);
|
|
||||||
pointer.raw_pose = Affine3A::from_rotation_translation(new_quat, new_pos);
|
pointer.raw_pose = Affine3A::from_rotation_translation(new_quat, new_pos);
|
||||||
pointer.pose = Affine3A::from_rotation_translation(
|
pointer.pose = Affine3A::from_rotation_translation(
|
||||||
cur_quat.lerp(new_quat, lerp_factor),
|
cur_quat.lerp(new_quat, lerp_factor),
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ struct XrState {
|
|||||||
system: xr::SystemId,
|
system: xr::SystemId,
|
||||||
session: xr::Session<xr::Vulkan>,
|
session: xr::Session<xr::Vulkan>,
|
||||||
predicted_display_time: xr::Time,
|
predicted_display_time: xr::Time,
|
||||||
predicted_display_period: xr::Duration,
|
fps: f32,
|
||||||
stage: Arc<xr::Space>,
|
stage: Arc<xr::Space>,
|
||||||
view: Arc<xr::Space>,
|
view: Arc<xr::Space>,
|
||||||
stage_offset: Affine3A,
|
stage_offset: Affine3A,
|
||||||
@@ -132,7 +132,7 @@ pub fn openxr_run(running: Arc<AtomicBool>, show_by_default: bool) -> Result<(),
|
|||||||
system,
|
system,
|
||||||
session,
|
session,
|
||||||
predicted_display_time: xr::Time::from_nanos(0),
|
predicted_display_time: xr::Time::from_nanos(0),
|
||||||
predicted_display_period: xr::Duration::from_nanos(10_000_000),
|
fps: 30.0,
|
||||||
stage: Arc::new(stage),
|
stage: Arc::new(stage),
|
||||||
view: Arc::new(view),
|
view: Arc::new(view),
|
||||||
stage_offset: Affine3A::IDENTITY,
|
stage_offset: Affine3A::IDENTITY,
|
||||||
@@ -155,6 +155,8 @@ pub fn openxr_run(running: Arc<AtomicBool>, show_by_default: bool) -> Result<(),
|
|||||||
let mut next_device_update = Instant::now();
|
let mut next_device_update = Instant::now();
|
||||||
let mut due_tasks = VecDeque::with_capacity(4);
|
let mut due_tasks = VecDeque::with_capacity(4);
|
||||||
|
|
||||||
|
let mut fps_counter: VecDeque<Instant> = VecDeque::new();
|
||||||
|
|
||||||
let mut main_session_visible = false;
|
let mut main_session_visible = false;
|
||||||
|
|
||||||
'main_loop: loop {
|
'main_loop: loop {
|
||||||
@@ -233,7 +235,24 @@ pub fn openxr_run(running: Arc<AtomicBool>, show_by_default: bool) -> Result<(),
|
|||||||
frame_stream.begin()?;
|
frame_stream.begin()?;
|
||||||
|
|
||||||
xr_state.predicted_display_time = xr_frame_state.predicted_display_time;
|
xr_state.predicted_display_time = xr_frame_state.predicted_display_time;
|
||||||
xr_state.predicted_display_period = xr_frame_state.predicted_display_period;
|
xr_state.fps = {
|
||||||
|
fps_counter.push_back(Instant::now());
|
||||||
|
|
||||||
|
while let Some(time) = fps_counter.front() {
|
||||||
|
if time.elapsed().as_secs_f32() > 1. {
|
||||||
|
fps_counter.pop_front();
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let total_elapsed = fps_counter
|
||||||
|
.front()
|
||||||
|
.map(|time| time.elapsed().as_secs_f32())
|
||||||
|
.unwrap_or(0f32);
|
||||||
|
|
||||||
|
fps_counter.len() as f32 / total_elapsed
|
||||||
|
};
|
||||||
|
|
||||||
if !xr_frame_state.should_render {
|
if !xr_frame_state.should_render {
|
||||||
frame_stream.end(
|
frame_stream.end(
|
||||||
|
|||||||
Reference in New Issue
Block a user