2009-07-28 78 views
0

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

我的使用路径大致如下变为每帧

  1. 渲染与纹理
  2. 更新纹理的几部分(其可以已经使用由先前绘制)一堆东西
  3. 渲染一些更多的东西与纹理
  4. 更新纹理的另一部分

我想到了一些方法来做到这一点,但我不确定哪一个去。我曾考虑过对每种方法进行基准测试,但是我无法知道所获得的结果是否代表硬件,或者只是我的硬件。

  • 哪个池最适合此任务的纹理?
  • 什么是更新此纹理的最佳方式?
    1. 呼叫LockRect和UnlockRect每个我需要更新
    2. 呼叫LockRect和UnlockRect整个质地
    3. 呼叫LockRect和UnlockRect与D3DLOCK_DISCARD整个纹理,并从RAM中的位图复制区域。
    4. 创建一个完全新的纹理每次我需要“更新”
    5. 使用1,2或3,从这个表面
    6. 同更新D3DPOOL_SYSMEM表面,然后UpdateSurface更新我的质感0级5但指定RECT覆盖整个区域,我需要
    7. 同5,但多次调用,一个是我更新
    8. 也许另一种方式来做到这一点我还没有考虑过的每个区域...

需要注意的是,与整个纹理的大小相比,我正在更新的区域通常相当小,例如纹理可能是1024 * 1024,我可能需要更新5个或更多64 * 64区域。

回答

-1
  • D3DPOOL_DEFAULT
  • D3DUSAGE_DYNAMIC
  • 呼叫LockRect和UnlockRect为每个需要更新区域

- >这是最快的!

基准将遵循...

1

如果您需要更新多个区域,您应该在解锁前锁定整机的质感和使用D3DLOCK_NO_DIRTY_UPDATE标志,然后为每个区域呼叫AddDirtyRect。

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