refactor: Sleep in parallel while doing independent work
Signed-off-by: Schmarni <marnistromer@gmail.com>
This commit is contained in:
47
src/main.rs
47
src/main.rs
@@ -42,7 +42,6 @@ use bevy_mod_xr::session::{XrFirst, XrPreDestroySession, XrSessionCreated, XrSes
|
|||||||
use bevy_mod_xr::spaces::XrPrimaryReferenceSpace;
|
use bevy_mod_xr::spaces::XrPrimaryReferenceSpace;
|
||||||
use bevy_plugin::{DbusConnection, InputUpdate, StardustBevyPlugin, StardustFirst};
|
use bevy_plugin::{DbusConnection, InputUpdate, StardustBevyPlugin, StardustFirst};
|
||||||
use clap::Parser;
|
use clap::Parser;
|
||||||
use tracing::level_filters::LevelFilter;
|
|
||||||
use core::client::Client;
|
use core::client::Client;
|
||||||
use core::task;
|
use core::task;
|
||||||
use directories::ProjectDirs;
|
use directories::ProjectDirs;
|
||||||
@@ -62,8 +61,10 @@ use stardust_xr::server;
|
|||||||
use std::ops::Deref;
|
use std::ops::Deref;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
use std::thread;
|
||||||
use tokio::net::UnixListener;
|
use tokio::net::UnixListener;
|
||||||
use tokio::sync::Notify;
|
use tokio::sync::Notify;
|
||||||
|
use tracing::level_filters::LevelFilter;
|
||||||
use tracing::{debug_span, error, info, warn};
|
use tracing::{debug_span, error, info, warn};
|
||||||
use tracing_subscriber::{fmt, prelude::*, EnvFilter};
|
use tracing_subscriber::{fmt, prelude::*, EnvFilter};
|
||||||
use zbus::fdo::ObjectManager;
|
use zbus::fdo::ObjectManager;
|
||||||
@@ -332,7 +333,7 @@ fn bevy_loop(
|
|||||||
cams.iter().for_each(|e| {
|
cams.iter().for_each(|e| {
|
||||||
cmds.entity(e).remove::<Skybox>();
|
cmds.entity(e).remove::<Skybox>();
|
||||||
});
|
});
|
||||||
let _span = debug_span!("spawn");
|
let _span = debug_span!("spawn");
|
||||||
cmds.insert_resource(ClearColor(Color::NONE));
|
cmds.insert_resource(ClearColor(Color::NONE));
|
||||||
}
|
}
|
||||||
*last_hidden = env_hidden;
|
*last_hidden = env_hidden;
|
||||||
@@ -416,26 +417,36 @@ fn bevy_loop(
|
|||||||
{
|
{
|
||||||
world.run_system_cached(sync_sets);
|
world.run_system_cached(sync_sets);
|
||||||
}
|
}
|
||||||
world.run_schedule(InputUpdate);
|
let thread = world
|
||||||
let session = world.remove_resource::<OxrSession>();
|
|
||||||
let mut objects = world.remove_resource::<ServerObjects>().unwrap();
|
|
||||||
objects.update(session.as_deref(), time);
|
|
||||||
world.insert_resource(objects);
|
|
||||||
if let Some(session) = session {
|
|
||||||
world.insert_resource(session);
|
|
||||||
}
|
|
||||||
input::process_input();
|
|
||||||
nodes::root::Root::send_frame_events(world.resource::<Time>().delta_secs_f64());
|
|
||||||
if world
|
|
||||||
.run_system_cached(should_run_frame_loop)
|
.run_system_cached(should_run_frame_loop)
|
||||||
.unwrap_or(true)
|
.unwrap_or(true)
|
||||||
{
|
.then(|| world.remove_resource::<OxrFrameWaiter>())
|
||||||
let _span = debug_span!("eeping").entered();
|
.flatten()
|
||||||
let mut waiter = world.remove_resource::<OxrFrameWaiter>().unwrap();
|
.map(|mut waiter| {
|
||||||
let state = waiter.wait().unwrap();
|
TOKIO.spawn_blocking(move || {
|
||||||
|
let _span = debug_span!("eeping").entered();
|
||||||
|
let result = waiter.wait();
|
||||||
|
(waiter, result)
|
||||||
|
})
|
||||||
|
});
|
||||||
|
world.run_schedule(InputUpdate);
|
||||||
|
debug_span!("update_objects").in_scope(|| {
|
||||||
|
let session = world.remove_resource::<OxrSession>();
|
||||||
|
let mut objects = world.remove_resource::<ServerObjects>().unwrap();
|
||||||
|
objects.update(session.as_deref(), time);
|
||||||
|
world.insert_resource(objects);
|
||||||
|
if let Some(session) = session {
|
||||||
|
world.insert_resource(session);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
input::process_input();
|
||||||
|
nodes::root::Root::send_frame_events(world.resource::<Time>().delta_secs_f64());
|
||||||
|
if let Some((waiter, Ok(state))) = thread.map(|t| TOKIO.block_on(t).unwrap()) {
|
||||||
world.insert_resource(OxrFrameState(state));
|
world.insert_resource(OxrFrameState(state));
|
||||||
world.insert_resource(waiter);
|
world.insert_resource(waiter);
|
||||||
world.run_system_cached(update_cameras);
|
if let Err(err) = world.run_system_cached(update_cameras) {
|
||||||
|
error!("error while running oxr update_cameras system: {err}");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#[cfg(feature = "wayland")]
|
#[cfg(feature = "wayland")]
|
||||||
wayland.update();
|
wayland.update();
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
use crate::bevy_plugin::DbusConnection;
|
use crate::bevy_plugin::{DbusConnection, InputUpdate};
|
||||||
use crate::core::client::INTERNAL_CLIENT;
|
use crate::core::client::INTERNAL_CLIENT;
|
||||||
use crate::nodes::fields::{Field, FieldTrait};
|
use crate::nodes::fields::{Field, FieldTrait};
|
||||||
use crate::nodes::input::{InputDataType, InputHandler, INPUT_HANDLER_REGISTRY};
|
use crate::nodes::input::{InputDataType, InputHandler, INPUT_HANDLER_REGISTRY};
|
||||||
@@ -12,7 +12,9 @@ use crate::objects::{ObjectHandle, SpatialRef};
|
|||||||
use crate::DefaultMaterial;
|
use crate::DefaultMaterial;
|
||||||
use bevy::app::{Plugin, PostUpdate};
|
use bevy::app::{Plugin, PostUpdate};
|
||||||
use bevy::asset::{AssetServer, Assets, Handle};
|
use bevy::asset::{AssetServer, Assets, Handle};
|
||||||
use bevy::prelude::{Commands, Component, Entity, Gizmos, IntoSystemConfigs as _, Query, Res, ResMut};
|
use bevy::prelude::{
|
||||||
|
Commands, Component, Entity, Gizmos, IntoSystemConfigs as _, Query, Res, ResMut,
|
||||||
|
};
|
||||||
use bevy::utils::default;
|
use bevy::utils::default;
|
||||||
use bevy_mod_openxr::helper_traits::{ToQuat, ToVec3};
|
use bevy_mod_openxr::helper_traits::{ToQuat, ToVec3};
|
||||||
use bevy_mod_openxr::resources::OxrFrameState;
|
use bevy_mod_openxr::resources::OxrFrameState;
|
||||||
@@ -43,8 +45,7 @@ pub struct StardustHandPlugin;
|
|||||||
impl Plugin for StardustHandPlugin {
|
impl Plugin for StardustHandPlugin {
|
||||||
fn build(&self, app: &mut bevy::prelude::App) {
|
fn build(&self, app: &mut bevy::prelude::App) {
|
||||||
app.add_systems(XrSessionCreated, create_hands);
|
app.add_systems(XrSessionCreated, create_hands);
|
||||||
app.add_systems(PostUpdate, update_hands);
|
app.add_systems(InputUpdate, (update_hands,draw_hand_gizmos).chain());
|
||||||
app.add_systems(PostUpdate, draw_hand_gizmos.after(update_hands));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -278,4 +279,3 @@ impl SkHand {
|
|||||||
+ (ring_tip_distance * 0.15)
|
+ (ring_tip_distance * 0.15)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user