我正在尝试加速全屏纹理的绘制,这会改变每一帧。在我的系统上,我可以使用GDI和BitBlt()获得大约1000 FPS,但我认为我可以通过使用Direct3D和动态纹理来提高性能。相反,我只能获得250 FPS左右。
我正在使用带有当前驱动程序的ATI HD 4870在Mac Pro上运行。
我尝试过使用动态纹理,这给了我一个小的增益(~15FPS),我尝试使用纹理链来避免管道停滞而且没有效果。
我看了很多,而且这方面使用动态纹理的信息非常少。
我错过了一些基本的东西吗?
设备设置:
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); ... write texture data texture->UnlockRect(0); device->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, vertices, sizeof(*vertices)); ...
您可以从中获取正在进行的工作代码 http://www.libsdl.org/tmp/SDL-1.3.zip
谢谢!
答案 0 :(得分:3)
如果您不需要回读纹理,则可以使用(D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY)标志创建纹理。
答案 1 :(得分:1)
DrawPrimitiveUP非常慢。您应该使用动态顶点缓冲区(使用nooverwrite更新,如果已满,则丢弃)。