gpt4 book ai didi

c# - 为什么 `Texture2D` 不公开其像素数据?

转载 作者:行者123 更新时间:2023-11-30 19:44:29 26 4
gpt4 key购买 nike

我可以很容易地想到许多情况,在这些情况下更改 Texture2D 中的单个像素会很有用。 ,特别是因为不断做 GetData<>(); SetData<>(); 时性能下降和不便每一帧或绘图到一个 RenderTarget2D .

有什么真正的理由为单个像素公开 setter 方法吗?如果不是,有没有办法不使用上述方法修改单个像素?

最佳答案

出于性能原因,在初始化纹理时,纹理数据几乎总是由图形驱动程序复制到视频内存 (VRAM)。这使得在 GPU 上运行的着色器获取纹理显着更快;如果每次纹理缓存未命中都必须通过 PCIe 总线获取丢失的数据,您肯定不会高兴!

但是,正如您所注意到的,这会使 CPU 读取或修改数据变得困难和/或变慢。不仅 PCIe 总线相对较慢,而且 VRAM 通常不能被 CPU 直接寻址;通常必须使用特殊的低级 DMA 命令传输数据。这正是您在使用 XNA 的 GetData<>() 时看到性能下降的原因。和 SetData<>() :杀死您的不是函数调用开销,而是他们必须在您背后将数据来回复制到 VRAM。

如果您想修改 VRAM 中的数据,低级渲染 API(例如 OpenGL 或 Direct3D 11)为您提供了三个选项:

  1. 在您更改之前临时“映射”像素数据(这涉及将其复制回主内存)并在您完成编辑后“取消映射”(将更改提交回 VRAM)。这大概就是GetData<>()SetData<>()正在内部做。
  2. 使用类似于 OpenGL 的 glTexSubImage2D() 的函数,这实际上跳过了“映射”步骤,将新的像素数据直接复制回 VRAM,覆盖了之前的内容。
  3. 通过运行将纹理写入作为渲染目标的着色器,指示 GPU 代表您进行修改。

XNA 建立在 Direct3D 之上,因此它也必须在这些限制内工作。所以,没有适合您的原始像素数据!

(顺便说一句,以上所有内容也适用于 GPU 缓冲区数据。)

关于c# - 为什么 `Texture2D` 不公开其像素数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12327604/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com