更新Direct3D纹理的最佳方法

时间:2009-07-28 07:50:03

标签: direct3d textures

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

我的使用路径每帧都有以下几行

  1. 使用纹理
  2. 渲染一堆东西
  3. 更新纹理的一些部分(可能是之前渲染使用过的)
  4. 使用纹理
  5. 渲染更多内容
  6. 更新纹理的另一部分
  7. 我想过几种方法可以做到这一点,但我不确定哪一种方法可以使用。我考虑过对每种方法进行基准测试,但是我无法知道我得到的结果是代表硬件,还是只代表我的硬件。

    • 哪个池最适合此任务的纹理?
    • 更新此纹理的最佳方法是什么?
      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个区域

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:-1)

  • D3DPOOL_DEFAULT
  • D3DUSAGE_DYNAMIC
  • 为您需要更新的每个区域调用LockRect和UnlockRect

- >这是最快的!

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