为什么在“Map”调用后,“RowPitch”会大得不可思议?

Why could `RowPitch` be impossibly large after a `Map` call?

提问人:LOST 提问时间:9/10/2023 最后编辑:LOST 更新时间:9/11/2023 访问量:17

问:

我正在尝试保存屏幕截图。

首先,通过复制原始纹理的描述来制作暂存纹理

CpuAccessFlags = CpuAccessFlags.Read,
Usage = ResourceUsage.Staging,
BindFlags = BindFlags.None,

和调用CopyResource

接下来,在我调用的另一个线程中(在 SharpDX 中),并且调用成功,但是在返回的结构中具有看似不可能的值:0xc204a428(超过 2GB)。MapMapSubresourceRowPitch

为什么我得到一个明显无效的值?

直接3D11

评论

0赞 Soonts 11/6/2023
两个可能的原因。(1)多线程问题。设备上下文不是线程安全的。从后台线程调用 map/unmap 子资源时,必须使用某些锁来防止任何其他线程使用设备上下文。诊断的一个好方法是在创建设备时传递标志,在 Visual Studio 中选中“启用本机调试”,并在附加调试器的情况下运行应用,您应该会在 IDE 的“输出”窗口中看到这些诊断消息。(2)另一个可能的原因是SharpDX库中的错误。D3D11_CREATE_DEVICE_DEBUG

答: 暂无答案