fix(input): reduce latency by several frames

This commit is contained in:
Nova
2023-01-14 11:03:47 -05:00
parent 795780130c
commit 457ff55904
2 changed files with 23 additions and 18 deletions

View File

@@ -191,24 +191,25 @@ impl InputHandler {
let method = Arc::downgrade(&distance_link.method); let method = Arc::downgrade(&distance_link.method);
let handler = Arc::downgrade(&distance_link.handler); let handler = Arc::downgrade(&distance_link.handler);
tokio::spawn(async move { if let Ok(data) = node.execute_remote_method("input", data) {
let data = node.execute_remote_method("input", data).await; tokio::spawn(async move {
if frame == FRAME.load(Ordering::Relaxed) { if let Ok(data) = data.await {
if let Ok(data) = data { if frame == FRAME.load(Ordering::Relaxed) {
let capture = flexbuffers::Reader::get_root(data.as_slice()) let capture = flexbuffers::Reader::get_root(data.as_slice())
.and_then(|data| data.get_bool()) .and_then(|data| data.get_bool())
.unwrap_or(false); .unwrap_or(false);
if let Some(method) = method.upgrade() { if let Some(method) = method.upgrade() {
if let Some(handler) = handler.upgrade() { if let Some(handler) = handler.upgrade() {
if capture { if capture {
method.captures.add_raw(&handler); method.captures.add_raw(&handler);
}
} }
} }
} }
} }
} });
}); }
} }
} }
impl Drop for InputHandler { impl Drop for InputHandler {

View File

@@ -15,6 +15,7 @@ use once_cell::sync::OnceCell;
use parking_lot::Mutex; use parking_lot::Mutex;
use stardust_xr::messenger::MessageSenderHandle; use stardust_xr::messenger::MessageSenderHandle;
use stardust_xr::scenegraph::ScenegraphError; use stardust_xr::scenegraph::ScenegraphError;
use std::future::Future;
use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::{Arc, Weak}; use std::sync::{Arc, Weak};
use std::vec::Vec; use std::vec::Vec;
@@ -235,15 +236,18 @@ impl Node {
.transpose()?; .transpose()?;
Ok(()) Ok(())
} }
pub async fn execute_remote_method(&self, method: &str, data: Vec<u8>) -> Result<Vec<u8>> { pub fn execute_remote_method(
&self,
method: &str,
data: Vec<u8>,
) -> Result<impl Future<Output = Result<Vec<u8>>>> {
let message_sender_handle = self let message_sender_handle = self
.message_sender_handle .message_sender_handle
.as_ref() .as_ref()
.ok_or(eyre!("Messenger does not exist for this node"))?; .ok_or(eyre!("Messenger does not exist for this node"))?;
message_sender_handle let future = message_sender_handle.method(self.path.as_str(), method, &data)?;
.method(self.path.as_str(), method, &data)?
.await Ok(async { future.await.map_err(|e| eyre!(e)) })
.map_err(|e| eyre!(e))
} }
} }