feat: 截屏改为抽样,提升性能。
This commit is contained in:
		
							
								
								
									
										7
									
								
								src-tauri/Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										7
									
								
								src-tauri/Cargo.lock
									
									
									
										generated
									
									
									
								
							| @@ -573,6 +573,7 @@ dependencies = [ | ||||
|  "base64", | ||||
|  "bmp", | ||||
|  "color_space", | ||||
|  "either", | ||||
|  "futures", | ||||
|  "hex", | ||||
|  "once_cell", | ||||
| @@ -611,6 +612,12 @@ version = "1.0.3" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "0bd4b30a6560bbd9b4620f4de34c3f14f60848e58a9b7216801afcb4c7b31c3c" | ||||
|  | ||||
| [[package]] | ||||
| name = "either" | ||||
| version = "1.8.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" | ||||
|  | ||||
| [[package]] | ||||
| name = "embed_plist" | ||||
| version = "1.2.2" | ||||
|   | ||||
| @@ -32,6 +32,7 @@ rumqttc = "0.17.0" | ||||
| time = { version = "0.3.17", features = ["formatting"] } | ||||
| color_space = "0.5.3" | ||||
| futures = "0.3.25" | ||||
| either = "1.8.0" | ||||
|  | ||||
| [features] | ||||
| # by default Tauri runs in production mode | ||||
|   | ||||
| @@ -120,13 +120,15 @@ impl CoreManager { | ||||
|                     let start_at = Instant::now(); | ||||
|                     match screenshot.get_top_colors().await { | ||||
|                         Ok(colors) => { | ||||
|                             let start = screenshot.get_top_of_led_strip_range().min().unwrap_or(0); | ||||
|                             let start = screenshot.get_top_of_led_start_at().min(screenshot.get_top_of_led_end_at()); | ||||
|  | ||||
|                             let colors_len = colors.len(); | ||||
|                             for (index, color) in colors.into_iter().enumerate() { | ||||
|                                 global_colors.insert(index + start, color); | ||||
|                             } | ||||
|  | ||||
|                             info!("led count: {}, spend: {:?}", global_colors.len(), start_at.elapsed()); | ||||
|  | ||||
|                             if global_colors.len() == 60 { | ||||
|                                 let mut colors = vec![]; | ||||
|                                 for index in 0..global_colors.len() { | ||||
| @@ -165,6 +167,7 @@ impl CoreManager { | ||||
|         tx: mpsc::Sender<Screenshot>, | ||||
|     ) -> anyhow::Result<()> { | ||||
|         let mut picker = DisplayPicker::from_config(config)?; | ||||
|         info!("width: {}", picker.config.display_width); | ||||
|  | ||||
|         loop { | ||||
|             let start = Instant::now(); | ||||
| @@ -173,7 +176,7 @@ impl CoreManager { | ||||
|             if let AmbientLightMode::Follow = *lock { | ||||
|                 drop(lock); | ||||
|                 let screenshot = picker.take_screenshot()?; | ||||
|                 // info!("Take Screenshot Spend: {:?}", start.elapsed()); | ||||
|                 info!("Take Screenshot Spend: {:?}", start.elapsed()); | ||||
|                 tx.send(screenshot).await; | ||||
|             } else { | ||||
|                 break; | ||||
|   | ||||
| @@ -35,8 +35,8 @@ impl Picker { | ||||
|                     display_height: 1200, | ||||
|                     top_led_strip: LedStripConfig { | ||||
|                         index: 1, | ||||
|                         global_start_position: 32, | ||||
|                         global_end_position: 60, | ||||
|                         global_start_position: 59, | ||||
|                         global_end_position: 32, | ||||
|                     }, | ||||
|                     bottom_led_strip: LedStripConfig { | ||||
|                         index: 0, | ||||
| @@ -60,8 +60,8 @@ impl Picker { | ||||
|                     display_height: 1692, | ||||
|                     top_led_strip: LedStripConfig { | ||||
|                         index: 0, | ||||
|                         global_start_position: 0, | ||||
|                         global_end_position: 32, | ||||
|                         global_start_position: 31, | ||||
|                         global_end_position: 0, | ||||
|                     }, | ||||
|                     bottom_led_strip: LedStripConfig { | ||||
|                         index: 0, | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
|  | ||||
| use std::ops::Range; | ||||
|  | ||||
| use color_space::{Hsv, Rgb}; | ||||
| use either::Either; | ||||
|  | ||||
| use super::{ | ||||
|     config::{DisplayConfig, LedStripConfig}, | ||||
| @@ -28,9 +28,11 @@ impl Screenshot { | ||||
|             .await | ||||
|     } | ||||
|  | ||||
|     pub fn get_top_of_led_strip_range(&self) -> Range<usize> { | ||||
|     pub fn get_top_of_led_start_at(&self) -> usize { | ||||
|         self.config.top_led_strip.global_start_position | ||||
|             ..self.config.top_led_strip.global_end_position | ||||
|     } | ||||
|     pub fn get_top_of_led_end_at(&self) -> usize { | ||||
|         self.config.top_led_strip.global_end_position | ||||
|     } | ||||
|  | ||||
|     async fn get_x_colors( | ||||
| @@ -41,7 +43,11 @@ impl Screenshot { | ||||
|         let bitmap = &self.bitmap; | ||||
|         let number_of_leds = strip_config | ||||
|             .global_start_position | ||||
|             .abs_diff(strip_config.global_end_position); | ||||
|             .abs_diff(strip_config.global_end_position) | ||||
|             + 1; | ||||
|         if number_of_leds == 0 { | ||||
|             return Ok(vec![]); | ||||
|         } | ||||
|         let cell_size_x = self.config.display_width / number_of_leds; | ||||
|         let cell_size_y = self.config.display_height / 8; | ||||
|         let cell_size = cell_size_x * cell_size_y; | ||||
| @@ -50,32 +56,43 @@ impl Screenshot { | ||||
|             XPosition::Bottom => { | ||||
|                 self.config.display_height - 20 - cell_size_y..self.config.display_height - 20 | ||||
|             } | ||||
|         } | ||||
|         .step_by(5); | ||||
|  | ||||
|         let x_range = if strip_config.global_start_position < strip_config.global_end_position { | ||||
|             Either::Left(strip_config.global_start_position..=strip_config.global_end_position) | ||||
|         } else { | ||||
|             Either::Right( | ||||
|                 (strip_config.global_end_position..=strip_config.global_start_position).rev(), | ||||
|             ) | ||||
|         }; | ||||
|  | ||||
|         let mut colors = Vec::new(); | ||||
|         let stride = bitmap.len() / self.config.display_height; | ||||
|  | ||||
|         for pos in strip_config.global_start_position..strip_config.global_end_position { | ||||
|         for pos in x_range { | ||||
|             let mut r = 0.0; | ||||
|             let mut g = 0.0; | ||||
|             let mut b = 0.0; | ||||
|             for x in pos * cell_size_x..(pos + 1) * cell_size_x { | ||||
|             let mut count = 0; | ||||
|             for x in (pos * cell_size_x..(pos + 1) * cell_size_x).step_by(5) { | ||||
|                 for y in y_range.to_owned() { | ||||
|                     let i = stride * y + 4 * x; | ||||
|                     r += bitmap[i + 2] as f64; | ||||
|                     g += bitmap[i + 1] as f64; | ||||
|                     b += bitmap[i] as f64; | ||||
|                     count+=1; | ||||
|                 } | ||||
|             } | ||||
|             let rgb = Rgb::new( | ||||
|                 r / cell_size as f64, | ||||
|                 g / cell_size as f64, | ||||
|                 b / cell_size as f64, | ||||
|                 r / count as f64, | ||||
|                 g / count as f64, | ||||
|                 b / count as f64, | ||||
|             ); | ||||
|             let hsv = Hsv::from(rgb); | ||||
|             // info!("HSV: {:?}", [hsv.h, hsv.s, hsv.v]); | ||||
|             let color = LedColor::from_hsv(hsv.h, hsv.s, hsv.v); | ||||
|             // info!("color: {:?}", color.get_rgb()); | ||||
|             // paris::info!("color: {:?}", color.get_rgb()); | ||||
|             colors.push(color); | ||||
|         } | ||||
|         return Ok(colors); | ||||
|   | ||||
| @@ -3,8 +3,8 @@ import ReactDOM from "react-dom/client"; | ||||
| import App from "./App"; | ||||
| import "./style.css"; | ||||
|  | ||||
| ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render( | ||||
| ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( | ||||
|   <React.StrictMode> | ||||
|     <App /> | ||||
|   </React.StrictMode> | ||||
| ); | ||||
|   </React.StrictMode>, | ||||
| ); | ||||
		Reference in New Issue
	
	Block a user