Skip to content

Commit f7dd52d

Browse files
author
LChen
committed
优化客户端结构,减小CPU占用
1 parent ae4fa0f commit f7dd52d

File tree

2 files changed

+164
-170
lines changed

2 files changed

+164
-170
lines changed

dsclient/src/client.rs

Lines changed: 162 additions & 168 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,11 @@ use fltk::input::Input;
55
use fltk::input::SecretInput;
66
use fltk::prelude::InputExt;
77
use fltk::window::Window;
8-
use std::cell::RefCell;
98
use std::collections::hash_map::DefaultHasher;
109
use std::hash::Hasher;
1110
use std::io::Read;
1211
use std::io::Write;
1312
use std::net::TcpStream;
14-
use std::rc::Rc;
1513
use std::sync::Arc;
1614
use std::sync::RwLock;
1715

@@ -55,52 +53,168 @@ pub fn app_run() {
5553
}
5654

5755
fn draw(app: app::App, host: String, pwd: String) {
58-
let mut conn = TcpStream::connect(host).unwrap();
59-
// 认证
60-
let mut hasher = DefaultHasher::new();
61-
hasher.write(pwd.as_bytes());
62-
let pk = hasher.finish();
63-
conn.write_all(&[
64-
(pk >> (7 * 8)) as u8,
65-
(pk >> (6 * 8)) as u8,
66-
(pk >> (5 * 8)) as u8,
67-
(pk >> (4 * 8)) as u8,
68-
(pk >> (3 * 8)) as u8,
69-
(pk >> (2 * 8)) as u8,
70-
(pk >> (1 * 8)) as u8,
71-
pk as u8,
72-
])
73-
.unwrap();
74-
let mut suc = [0u8];
75-
conn.read_exact(&mut suc).unwrap();
76-
if suc[0] != 1 {
77-
// 密码错误
78-
return;
79-
}
80-
// 发送指令socket
81-
let mut txc = conn.try_clone().unwrap();
82-
// 接收meta信息
83-
let mut meta = [0u8; 4];
84-
if let Err(_) = conn.read_exact(&mut meta) {
85-
return;
86-
}
87-
let w = (((meta[0] as u16) << 8) | meta[1] as u16) as i32;
88-
let h = (((meta[2] as u16) << 8) | meta[3] as u16) as i32;
56+
// 开始绘制wind2窗口
57+
let (sw, sh) = app::screen_size();
58+
let mut wind_screen = Window::default().with_size((sw / 2.0) as i32, (sh / 2.0) as i32);
59+
let mut frame = Frame::default().size_of(&wind_screen);
60+
wind_screen.make_resizable(true);
61+
wind_screen.end();
62+
wind_screen.show();
63+
64+
std::thread::spawn(move || {
65+
let mut conn = TcpStream::connect(host).unwrap();
66+
// 认证
67+
let mut hasher = DefaultHasher::new();
68+
hasher.write(pwd.as_bytes());
69+
let pk = hasher.finish();
70+
conn.write_all(&[
71+
(pk >> (7 * 8)) as u8,
72+
(pk >> (6 * 8)) as u8,
73+
(pk >> (5 * 8)) as u8,
74+
(pk >> (4 * 8)) as u8,
75+
(pk >> (3 * 8)) as u8,
76+
(pk >> (2 * 8)) as u8,
77+
(pk >> (1 * 8)) as u8,
78+
pk as u8,
79+
])
80+
.unwrap();
81+
let mut suc = [0u8];
82+
conn.read_exact(&mut suc).unwrap();
83+
if suc[0] != 1 {
84+
// 密码错误
85+
return;
86+
}
87+
// 发送指令socket
88+
let mut txc = conn.try_clone().unwrap();
89+
// 接收meta信息
90+
let mut meta = [0u8; 4];
91+
if let Err(_) = conn.read_exact(&mut meta) {
92+
return;
93+
}
94+
let w = (((meta[0] as u16) << 8) | meta[1] as u16) as i32;
95+
let h = (((meta[2] as u16) << 8) | meta[3] as u16) as i32;
8996

90-
let dlen = (w * h * 3) as usize;
91-
// 解包
92-
let depack = |buffer: &[u8]| -> usize {
93-
((buffer[0] as usize) << 16) | ((buffer[1] as usize) << 8) | (buffer[2] as usize)
94-
};
97+
let dlen = (w * h * 3) as usize;
98+
// 解包
99+
let depack = |buffer: &[u8]| -> usize {
100+
((buffer[0] as usize) << 16) | ((buffer[1] as usize) << 8) | (buffer[2] as usize)
101+
};
95102

96-
// 收到的数据
97-
let data = Vec::<u8>::with_capacity(dlen);
98-
let _data = Arc::new(RwLock::new(data));
99-
let arc_data1 = Arc::clone(&_data);
100-
let arc_data2 = Arc::clone(&_data);
103+
// 收到的数据
104+
let data = vec![0u8; dlen];
105+
let _data = Arc::new(RwLock::new(data));
106+
let arc_data1 = Arc::clone(&_data);
107+
let arc_data2 = Arc::clone(&_data);
108+
109+
frame.draw(move |f| match arc_data2.read() {
110+
Ok(data) => {
111+
if let Ok(mut image) = image::RgbImage::new(&data, w, h, enums::ColorDepth::Rgb8) {
112+
image.scale(f.width(), f.height(), false, true);
113+
image.draw(f.x(), f.y(), f.width(), f.height());
114+
}
115+
}
116+
Err(_) => {}
117+
});
118+
let mut hooked = false;
119+
let mut bmap = bitmap::Bitmap::new();
120+
let mut cmd_buf = [0u8; 5];
121+
frame.handle(move |f, ev| {
122+
match ev {
123+
Event::Enter => {
124+
// 进入窗口
125+
hooked = true;
126+
}
127+
Event::Leave => {
128+
// 离开窗口
129+
hooked = false;
130+
}
131+
Event::KeyDown if hooked => {
132+
// 按键按下
133+
let key = app::event_key().bits() as u8;
134+
cmd_buf[0] = dscom::KEY_DOWN;
135+
cmd_buf[1] = key;
136+
if bmap.push(key) {
137+
txc.write_all(&cmd_buf[..2]).unwrap();
138+
}
139+
}
140+
Event::Shortcut if hooked => {
141+
// 按键按下
142+
let key = app::event_key().bits() as u8;
143+
cmd_buf[0] = dscom::KEY_DOWN;
144+
cmd_buf[1] = key;
145+
if bmap.push(key) {
146+
txc.write_all(&cmd_buf[..2]).unwrap();
147+
}
148+
}
149+
Event::KeyUp if hooked => {
150+
// 按键放开
151+
let key = app::event_key().bits() as u8;
152+
bmap.remove(key);
153+
cmd_buf[0] = dscom::KEY_UP;
154+
cmd_buf[1] = key;
155+
txc.write_all(&cmd_buf[..2]).unwrap();
156+
}
157+
Event::Move if hooked => {
158+
// 鼠标移动
159+
let relx = (w * app::event_x() / f.width()) as u16;
160+
let rely = (h * app::event_y() / f.height()) as u16;
161+
// MOVE xu xd yu yd
162+
cmd_buf[0] = dscom::MOVE;
163+
cmd_buf[1] = (relx >> 8) as u8;
164+
cmd_buf[2] = relx as u8;
165+
cmd_buf[3] = (rely >> 8) as u8;
166+
cmd_buf[4] = rely as u8;
167+
txc.write_all(&cmd_buf).unwrap();
168+
}
169+
Event::Push if hooked => {
170+
// 鼠标按下
171+
cmd_buf[0] = dscom::MOUSE_KEY_DOWN;
172+
cmd_buf[1] = app::event_key().bits() as u8;
173+
txc.write_all(&cmd_buf[..2]).unwrap();
174+
}
175+
Event::Released if hooked => {
176+
// 鼠标释放
177+
cmd_buf[0] = dscom::MOUSE_KEY_UP;
178+
cmd_buf[1] = app::event_key().bits() as u8;
179+
txc.write_all(&cmd_buf[..2]).unwrap();
180+
}
181+
Event::Drag if hooked => {
182+
// 鼠标按下移动
183+
let relx = (w * app::event_x() / f.width()) as u16;
184+
let rely = (h * app::event_y() / f.height()) as u16;
185+
// MOVE xu xd yu yd
186+
cmd_buf[0] = dscom::MOVE;
187+
cmd_buf[1] = (relx >> 8) as u8;
188+
cmd_buf[2] = relx as u8;
189+
cmd_buf[3] = (rely >> 8) as u8;
190+
cmd_buf[4] = rely as u8;
191+
txc.write_all(&cmd_buf).unwrap();
192+
}
193+
Event::MouseWheel if hooked => {
194+
// app::MouseWheel::Down;
195+
match app::event_dy() {
196+
app::MouseWheel::Down => {
197+
// 滚轮下滚
198+
cmd_buf[0] = dscom::MOUSE_WHEEL_DOWN;
199+
txc.write_all(&cmd_buf[..1]).unwrap();
200+
}
201+
app::MouseWheel::Up => {
202+
// 滚轮上滚
203+
cmd_buf[0] = dscom::MOUSE_WHEEL_UP;
204+
txc.write_all(&cmd_buf[..1]).unwrap();
205+
}
206+
_ => {}
207+
}
208+
}
209+
_ => {
210+
if hooked {
211+
println!("{}", ev);
212+
}
213+
}
214+
}
215+
true
216+
});
101217

102-
std::thread::spawn(move || {
103-
// let mut header = [0u8; 3];
104218
let mut recv_buf = Vec::<u8>::with_capacity(dlen);
105219
unsafe {
106220
recv_buf.set_len(dlen);
@@ -122,16 +236,15 @@ fn draw(app: app::App, host: String, pwd: String) {
122236
}
123237
Err(_) => {}
124238
}
239+
frame.redraw();
125240

126241
// 接收图像
127242
loop {
128243
if let Err(_) = conn.read_exact(&mut header) {
129-
app::quit();
130244
return;
131245
}
132246
let recv_len = depack(&header);
133247
if let Err(_) = conn.read_exact(&mut recv_buf[..recv_len]) {
134-
app::quit();
135248
return;
136249
}
137250
dscom::decompress(&recv_buf[..recv_len], &mut depres_data);
@@ -145,128 +258,9 @@ fn draw(app: app::App, host: String, pwd: String) {
145258
}
146259
Err(_) => {}
147260
}
261+
frame.redraw();
148262
}
149263
});
150-
// 开始绘制wind2窗口
151-
let (sw, sh) = app::screen_size();
152-
let mut wind_screen = Window::default().with_size((sw/2.0) as i32, (sh/2.0) as i32);
153-
let mut frame = Frame::default().size_of(&wind_screen);
154-
wind_screen.make_resizable(true);
155-
wind_screen.end();
156-
wind_screen.show();
264+
app.run().unwrap();
157265

158-
frame.draw(move |f| match arc_data2.read() {
159-
Ok(data) => {
160-
let d = &data;
161-
if let Ok(mut image) = image::RgbImage::new(d, w, h, enums::ColorDepth::Rgb8) {
162-
image.scale(f.width(), f.height(), false, true);
163-
image.draw(f.x(), f.y(), f.width(), f.height());
164-
}
165-
}
166-
Err(_) => {}
167-
});
168-
let hooked = Rc::new(RefCell::new(false));
169-
let press_record = Rc::new(RefCell::new(bitmap::Bitmap::new()));
170-
frame.handle(move |f, ev| {
171-
let mut hk = hooked.borrow_mut();
172-
let mut bmap = press_record.borrow_mut();
173-
match ev {
174-
Event::Enter => {
175-
// 进入窗口
176-
*hk = true;
177-
}
178-
Event::Leave => {
179-
// 离开窗口
180-
*hk = false;
181-
}
182-
Event::KeyDown if *hk => {
183-
// 按键按下
184-
let key = (app::event_key().bits() & 0xff) as u8;
185-
if bmap.push(key) {
186-
txc.write_all(&[dscom::KEY_DOWN, key]).unwrap();
187-
}
188-
}
189-
Event::Shortcut if *hk => {
190-
// 按键按下
191-
let key = (app::event_key().bits() & 0xff) as u8;
192-
if bmap.push(key) {
193-
txc.write_all(&[dscom::KEY_DOWN, key]).unwrap();
194-
}
195-
}
196-
Event::KeyUp if *hk => {
197-
// 按键放开
198-
let key = (app::event_key().bits() & 0xff) as u8;
199-
bmap.remove(key);
200-
txc.write_all(&[dscom::KEY_UP, key])
201-
.unwrap();
202-
}
203-
Event::Move if *hk => {
204-
// 鼠标移动
205-
let relx = (w * app::event_x() / f.width()) as u16;
206-
let rely = (h * app::event_y() / f.height()) as u16;
207-
// MOVE xu xd yu yd
208-
txc.write_all(&[
209-
dscom::MOVE,
210-
(relx >> 8) as u8,
211-
(relx & 0xff) as u8,
212-
(rely >> 8) as u8,
213-
(rely & 0xff) as u8,
214-
])
215-
.unwrap();
216-
}
217-
Event::Push if *hk => {
218-
// 鼠标按下
219-
txc.write_all(&[
220-
dscom::MOUSE_KEY_DOWN,
221-
(app::event_key().bits() & 0xff) as u8,
222-
])
223-
.unwrap();
224-
}
225-
Event::Released if *hk => {
226-
// 鼠标释放
227-
txc.write_all(&[dscom::MOUSE_KEY_UP, (app::event_key().bits() & 0xff) as u8])
228-
.unwrap();
229-
}
230-
Event::Drag if *hk => {
231-
// 鼠标按下移动
232-
let relx = (w * app::event_x() / f.width()) as u16;
233-
let rely = (h * app::event_y() / f.height()) as u16;
234-
// MOVE xu xd yu yd
235-
txc.write_all(&[
236-
dscom::MOVE,
237-
(relx >> 8) as u8,
238-
(relx & 0xff) as u8,
239-
(rely >> 8) as u8,
240-
(rely & 0xff) as u8,
241-
])
242-
.unwrap();
243-
}
244-
Event::MouseWheel if *hk => {
245-
// app::MouseWheel::Down;
246-
match app::event_dy() {
247-
app::MouseWheel::Down => {
248-
// 滚轮下滚
249-
txc.write_all(&[dscom::MOUSE_WHEEL_DOWN]).unwrap();
250-
}
251-
app::MouseWheel::Up => {
252-
// 滚轮上滚
253-
txc.write_all(&[dscom::MOUSE_WHEEL_UP]).unwrap();
254-
}
255-
_ => {}
256-
}
257-
}
258-
_ => {
259-
if *hk {
260-
println!("{}", ev);
261-
}
262-
}
263-
}
264-
true
265-
});
266-
let dura = 1.0 / (dscom::FPS as f64);
267-
while app.wait() {
268-
frame.redraw();
269-
// 30fps
270-
app::sleep(dura);
271-
}
272266
}

dscom/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11

22
// 默认帧率
3-
pub const FPS: u64 = 30;
3+
pub const FPS: u64 = 20;
44

55
// 传输像素保留位数(右边0越多压缩程度越大)
66
pub const BIT_SAVE: u8 = 0b1111_1000;
77

88
// 传输压缩水平0-21 0消耗资源最小但是压缩率小(需要带宽大) 21消耗资源最大,但但是压缩率大(需要带宽小)
9-
pub const COMPRESS_LEVEL: i32 = 0;
9+
pub const COMPRESS_LEVEL: i32 = 3;
1010

1111
// key事件 start
1212
pub const KEY_UP: u8 = 1;

0 commit comments

Comments
 (0)