我正在使用direct3d来渲染yuv视频数据。基本过程是:
使用CreateOffscreenPlain创建yv12表面 在这个表面上的lockrectangle获取数据指针,将yuv数据复制到它。 从这个表面伸展到后缓冲区 调用present以显示后台缓冲区。
在LockRectangle调用上有一个LockFlags参数,我们一直在使用LockFlags.Discard,听起来这意味着我们将覆盖整个缓冲区。
这似乎在一些英特尔板载图形设备上引起了一些问题(目前的例外),而如果我将LockFlags更改为LockFlags.None,问题似乎就会消失。我这样做了一个竞争条件吗?
我想我可能需要了解锁的必要性。显示是32位rgb所以我猜测yuv到rgb的转换是在stretchrectangle调用上完成的。这个过程假设是同步还是异步?我想我已经读过现在是异步的,但这对我来说无关紧要,因为这是我不直接接触的后备缓冲器的操作。
如果问题没有意义,我会道歉,我认为到目前为止我还没有很好的处理。答案 0 :(得分:0)
我觉得你使用D3D9?无论哪种方式都适用于所有API。
使用“D3DLOCK_DISCARD”时,应始终重写缓冲区中的所有数据。听起来你可能不是吗?
如果您的意图是重写缓冲区中的所有数据,那么出于性能原因,您确实希望使用“Discard”。如果您只编写部分数据,则可以使用“无”。
http://msdn.microsoft.com/en-us/library/windows/desktop/bb147263(v=vs.85).aspx “如果使用D3DLOCK_DISCARD调用锁定时图形处理器仍在使用缓冲区,则返回指向新内存区域的指针,而不是旧缓冲区数据。”