我正在尝试使用 Windows Graphics Capture Api (windows-capture) 构建屏幕捕获库,但处理映射缓冲区image stride 时出现问题,它是我当前处理的每个 RowPitch 末尾的空缓冲区像这样:
let row_size = self.width as usize * std::mem::size_of::<Rgba>();
for i in 0..self.height {
unsafe {
ptr::copy_nonoverlapping(
mapped_resource
.pData
.add((i * mapped_resource.RowPitch) as usize)
as *mut u8,
self.buffer.add(i as usize * row_size),
row_size,
)
};
}
这有点慢(我的 CPU 上为 4 毫秒),无论如何可以在 GPU 上执行此操作,这样速度会更快我尝试使用计算着色器,但它不起作用?
我基本上想要以最快的方式在 &[u8] 中获取屏幕像素数据缓冲区。
感谢您的帮助。
为了加快将屏幕像素数据从 Windows 图形捕获 API 传输到缓冲区的过程,采用基于 GPU 的技术可能不是最直接的方法。通常,GPU 技术用于处理和渲染,而不是直接内存操作。
尝试:
use std::ptr;
use std::mem;
let row_size = self.width as usize * mem::size_of::<Rgba>();
for i in 0..self.height {
let src = mapped_resource.pData.add((i * mapped_resource.RowPitch) as usize) as *const u8;
let dest = self.buffer.add(i as usize * row_size);
unsafe {
// Using memcpy for optimized memory copy
ptr::copy_nonoverlapping(src, dest as *mut u8, row_size);
}
}
如果此解决方案不起作用,请尝试以下操作:
多线程:如果未实现,请考虑跨多个线程并行执行内存复制操作。
批处理:尝试优化捕获的屏幕数据的检索或缓冲方式。
直接内存映射:检查是否可以直接从 GPU 到缓冲区利用直接内存映射。