【问题标题】:what do the lockflags do in direct3d锁定标志在direct3d中做了什么
【发布时间】:2012-08-10 02:46:34
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: video rendering direct3d


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 是的,我在 D3D9 上。我正在重写整个缓冲区,确实 DSDLOCK_DISCARD 在大多数系统上的性能似乎稍好一些,但我不明白为什么这个标志会在某些带有英特尔板载显卡的系统上导致异常。我不得不使用 LockFlags.None 来实现兼容性并忍受对性能的影响,而且我讨厌在那里有我不完全理解的修复。
    • 如果您不需要 Windows XP 支持,您可以迁移到 D3D11... 更简洁的 API 并在 Windows vista 到 Windows 8 上运行。D3D11 支持 direct3d9 视频卡。
    猜你喜欢
    • 2018-09-18
    • 2020-11-07
    • 2022-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    • 1970-01-01
    相关资源
    最近更新 更多