【问题标题】:Best way to update a Direct3D Texture更新 Direct3D 纹理的最佳方法
【发布时间】:2009-08-07 22:56:21
【问题描述】:

我需要在 Direct3D 9 中渲染一些 CPU 生成的图像,但我不确定将纹理数据放到显卡上的最佳方法,因为似乎有很多方法。

我的使用路径在每一帧都遵循以下几行

  1. 使用纹理渲染一堆东西
  2. 更新纹理的一些部分(之前的渲染可能已使用)
  3. 使用纹理渲染更多内容
  4. 更新纹理的另一部分
  5. 等等

我已经想到了几种方法来做到这一点,但我不确定该选择哪一种。我考虑过对每种方法进行基准测试,但是我无法知道我得到的任何结果是代表一般硬件还是仅代表我的硬件。

  • 哪个池最适合这项任务的纹理?
  • 更新此纹理的最佳方法是什么?
    1. 为我需要更新的每个区域调用 LockRect 和 UnlockRect
    2. 为整个纹理调用 LockRect 和 UnlockRect
    3. 使用 D3DLOCK_DISCARD 为整个纹理调用 LockRect 和 UnlockRect 并从 RAM 中复制位图。
    4. 每次我需要“更新”时创建一个全新的纹理
    5. 使用 1,2 或 3 更新 D3DPOOL_SYSMEM 中的表面,然后使用 UpdateSurface 更新此表面的纹理级别 0
    6. 与 5 相同,但指定 RECT 以覆盖我需要的整个区域
    7. 与 5 个相同,但要打多个电话,我更新的每个区域一个电话
    8. 可能还有另一种我还没有想到的方法...

应该注意的是,与整个纹理的大小相比,我正在更新的区域通常相当小,例如,纹理可能是 1024*1024,我可能想要更新 5 个左右 64*64 的区域.

【问题讨论】:

    标签: direct3d textures


    【解决方案1】:

    如果您需要更新多个区域,您应该锁定整个纹理并使用 D3DLOCK_NO_DIRTY_UPDATE 标志,然后在解锁之前为每个区域调用 AddDirtyRect。

    这当然取决于纹理的大小等,对于小纹理,从 ram 复制整个东西可能更有效。

    【讨论】:

      【解决方案2】:
      • D3DPOOL_DEFAULT
      • D3DUSAGE_DYNAMIC
      • 为您需要更新的每个区域调用 LockRect 和 UnlockRect

      --> 这是最快的!

      基准将随之而来......

      【讨论】:

        猜你喜欢
        • 2014-07-21
        • 1970-01-01
        • 1970-01-01
        • 2013-01-08
        • 1970-01-01
        • 2021-03-24
        • 2016-11-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多