mirror of
https://github.com/rustdesk/rustdesk.git
synced 2026-11-04 08:34:12 +00:00
perf(android): hand the captured frame over instead of copying it again (#16835)
#16827 made FrameRaw copy each frame while the Image is still valid, and then copy it a second time into the capturer in take(). Swap the owned buffer into dst instead: both callers own dst and only read it until their next call, so the two buffers alternate and take() holds the lock for constant time. A taken frame is copied once, as before #16827. Release the buffer whenever capture is enabled or disabled. FrameRaw is global, so it would otherwise keep a full frame after capture stops. Note why the would_block_if_equal check never fires, so that nobody revives it by accident. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
661befbb6d
commit
55786aaa57
1 file changed
+4
-2
@@ -59,6 +59,7 @@ impl FrameRaw {
|
||||
fn set_enable(&mut self, value: bool) {
|
||||
self.enable = value;
|
||||
self.ready = false;
|
||||
self.data = Vec::new();
|
||||
}
|
||||
|
||||
fn update(&mut self, data: *mut u8, len: usize) {
|
||||
@@ -81,12 +82,13 @@ impl FrameRaw {
|
||||
return None;
|
||||
}
|
||||
self.ready = false;
|
||||
// Never true: `last` starts empty and only `would_block_if_equal` fills it. Left off on
|
||||
// purpose: Android sends a frame only when the screen recomposes, so repeats are rare.
|
||||
if last.len() == self.data.len() && crate::would_block_if_equal(last, &self.data).is_err()
|
||||
{
|
||||
return None;
|
||||
}
|
||||
dst.clear();
|
||||
dst.extend_from_slice(&self.data);
|
||||
std::mem::swap(dst, &mut self.data);
|
||||
Some(())
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user