处理 DirectX 11 纹理 Image Stride 最有效的方法是什么

问题描述 投票:0回答:1

我正在尝试使用 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 rust directx
1个回答
0
投票

为了加快将屏幕像素数据从 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 到缓冲区利用直接内存映射。

© www.soinside.com 2019 - 2024. All rights reserved.