2

我正在使用 direct3d 渲染 yuv 视频数据。基本流程是:

在这个表面上使用 CreateOffscreenPlain lockrectangle 创建一个 yv12 表面以获取数据指针,将 yuv 数据复制到它。从这个表面拉伸矩形到后台缓冲区调用存在以显示后台缓冲区。

在 LockRectangle 调用中有一个 LockFlags 参数,我们一直在使用 LockFlags.Discard,这听起来意味着我们将覆盖整个缓冲区。

这似乎在某些英特尔板载图形设备上引起了一些问题(目前有例外),而如果我将 LockFlags 更改为 LockFlags.None,问题似乎就消失了。我这样做是否创造了竞争条件?

我想我可能需要了解这里锁定的必要性。显示器是 32 位 rgb,所以我猜 yuv 到 rgb 的转换是在 stretchrectangle 调用上完成的。这个过程是同步的还是异步的?我想我已经读过礼物是异步的,但这对我来说并不重要,因为这是对我不直接接触的后缓冲区的操作。

如果这些问题没有意义,我深表歉意,我认为到目前为止我还没有很好地处理这个问题。

4

1 回答 1

0

我假设您使用的是 D3D9?无论哪种方式,它在所有 API 上都是一样的。

使用“D3DLOCK_DISCARD”时,您应该始终重写缓冲区中的所有数据。听起来你可能不是?

如果您的意图是重写缓冲区中的所有数据,出于性能原因,您确实希望使用“丢弃”。如果您只写数据的一部分,您可以使用“无”。

http://msdn.microsoft.com/en-us/library/windows/desktop/bb147263(v=vs.85).aspx “如果图形处理器在使用 D3DLOCK_DISCARD 调用锁定时仍在使用缓冲区,则指向返回一个新的内存区域,而不是旧的缓冲区数据。”

于 2012-08-09T18:46:34.440 回答