如何提高Direct3D流纹理性能?

4

我正在尝试加速绘制每帧都会变化的全屏纹理。在我的系统上,使用GDI和BitBlt()可以获得大约1000 FPS的性能,但是我认为使用Direct3D和动态纹理可以提高性能。然而,我只得到了大约250 FPS。

我正在使用带有当前驱动程序的ATI HD 4870的Mac Pro。

我已经尝试过使用动态纹理来获得小幅增益(约15 FPS),并且尝试使用纹理链来避免管道停顿,但对性能没有影响。

我已经搜索了很多资料,关于如何使用动态纹理这方面的信息非常少。

我是否忽略了一些基本内容?

设备设置:

pparams.BackBufferCount = 1;
pparams.SwapEffect = D3DSWAPEFFECT_DISCARD;
pparams.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;

纹理创建:

device->CreateTexture(width, height, 1, D3DUSAGE_DYNAMIC,
                      D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &texture, NULL);

纹理更新:

texture->LockRect(0, &locked, NULL, D3DLOCK_DISCARD);
... 写入纹理数据
texture->UnlockRect(0);
device->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, vertices, sizeof(*vertices));
...

您可以从http://www.libsdl.org/tmp/SDL-1.3.zip获取正在进行的工作代码。

谢谢!

2个回答

3
如果您不需要读取纹理,则可以使用(D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY)标志创建纹理。

1

DrawPrimitiveUP非常慢。您应该使用动态顶点缓冲区(更新时不覆盖,如果已满则丢弃)。


我以前尝试过这个方法,当时我没有使用动态纹理,因为每帧只有一个DrawPrimitiveUP,所以似乎并没有什么影响。但如果使用动态纹理会更有影响吗? - Sam Lantinga
如果DrawPrimitiveUP不是问题,那么我猜测每帧都有驱动程序开销限制了你的最大加速。你应该尝试增加基准测试中每帧所完成的工作量。 - Axel Gneiting

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接