From 58c72b24c3d64fc6a79ca17da679b3b77fc21f85 Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Sun, 5 Apr 2020 22:46:19 -0400 Subject: [PATCH] smaller critical section, but didn't fix lag --- src/main.rs | 33 ++++++++++++++++++--------------- src/sensors.rs | 7 +++++-- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/src/main.rs b/src/main.rs index 9130074cdd..d0f27ebf36 100644 --- a/src/main.rs +++ b/src/main.rs @@ -19,6 +19,7 @@ use std::sync::{Arc, PoisonError, RwLockReadGuard}; use std::sync::RwLock; use std::thread; use std::time::Duration; +use std::sync::Mutex; use glium::{Display, glutin, Surface}; use glium::glutin::event::{Event, StartCause}; @@ -52,7 +53,7 @@ pub mod k4a_sys_wrapper; pub mod sensors; pub fn main() { - let frame : Arc>> = Arc::new(RwLock::new(None)); + let frame : Arc>> = Arc::new(Mutex::new(None)); let frame2 = frame.clone(); thread::spawn(move || { @@ -167,25 +168,27 @@ pub fn main() { let mut target = display.draw(); target.clear_color(0.0, 0.0, 1.0, 1.0); - let mut texture_frame : Option = None; + let mut dynamic_image : Option = None; - match frame.read() { - Ok(lock) => { - let frame_image = lock.as_ref(); - - match lock.as_ref() { - Some(dynamic_image) => { - let frame_image = dynamic_image.to_rgba(); - let frame_dimensions = frame_image.dimensions(); - let frame_image = glium::texture::RawImage2d::from_raw_rgba_reversed(&frame_image.into_raw(), frame_dimensions); - texture_frame = Some(glium::texture::Texture2d::new(&display, frame_image).unwrap()); - }, - None => {}, - } + match frame.lock() { + Ok(mut lock) => { + dynamic_image = lock.take(); }, Err(_) => {}, } + let mut texture_frame : Option = None; + + match dynamic_image { + Some(image) => { + let frame_image = image.to_rgba(); + let frame_dimensions = frame_image.dimensions(); + let frame_image = glium::texture::RawImage2d::from_raw_rgba_reversed(&frame_image.into_raw(), frame_dimensions); + texture_frame = Some(glium::texture::Texture2d::new(&display, frame_image).unwrap()); + }, + None => {}, + } + let texture_to_use: &Texture2d = texture_frame.as_ref().unwrap_or(&textureB); let uniforms = uniform! { diff --git a/src/sensors.rs b/src/sensors.rs index e5d7c5cc26..77385188da 100644 --- a/src/sensors.rs +++ b/src/sensors.rs @@ -5,6 +5,7 @@ use std::os::raw::c_char; use std::ptr; use std::slice; use std::sync::{Arc, PoisonError, RwLockWriteGuard}; +use std::sync::Mutex; use std::sync::RwLock; use std::thread; use std::time::Duration; @@ -33,7 +34,7 @@ use k4a_sys_wrapper::Device; use k4a_sys_wrapper::device_get_installed_count; use k4a_sys_wrapper::Image; -pub fn capture_thread(frame: Arc>>) { +pub fn capture_thread(frame: Arc>>) { let installed_devices = device_get_installed_count(); println!("Installed devices: {}", installed_devices); @@ -60,14 +61,16 @@ pub fn capture_thread(frame: Arc>>) { continue; // We didn't grab a frame. }, } + println!("Got frame!"); let image = captured_image.unwrap(); let image_image = depth_to_image(&image) .expect("depth_to_image should work"); - match frame.write() { + match frame.lock() { Ok(mut lock) => { + println!("Wrote to mutex!"); *lock = Some(image_image) }, Err(_) => {