DirectX9 - 高效绘制精灵

时间:2011-07-01 18:16:12

标签: performance drawing directx sprite directx-9

我正在尝试创建一个平台游戏,我正在拍摄各种精灵块,并将它们拼接在一起以绘制关卡。这需要在每一帧上在屏幕上绘制大量精灵。一台好的计算机处理绘制所有精灵没有问题,但它开始影响旧计算机的性能。由于这不是一个大游戏,我希望它能够在几乎任何计算机上运行。现在,我使用以下DirectX函数绘制我的精灵:

D3DXVECTOR3 center(0.0f, 0.0f, 0.0f);

D3DXVECTOR3 position(static_cast<float>(x), static_cast<float>(y), z);

(my LPD3DXSPRITE object)->Draw((sprite texture pointer), NULL, &center, &position, D3DCOLOR_ARGB(a, r, g, b));

有没有更有效的方法在屏幕上绘制这些图片?有没有办法可以使用不太复杂的图片文件(我现在正在使用常规的png)来加快速度?

总结一下:在DirectX中绘制精灵的性能最友好的方法是什么?谢谢!

2 个答案:

答案 0 :(得分:4)

您正在使用的ID3DXSPRITE接口已经非常高效。如果可能,请在精灵开始和结束调用之间确保所有精灵绘制调用都在一个批次中发生。这允许sprite接口以最有效的方式排列绘图。

为了获得额外的性能,您可以将多个较小的纹理加载到一个较大的纹理中,并使用纹理坐标将它们取出。这样就可以不必频繁地交换纹理。参见:

http://nexe.gamedev.net/directknowledge/default.asp?p=ID3DXSprite

用于纹理的文件类型无关紧要,只要它们被预加载到纹理中即可。加载游戏/关卡时,请务必将其全部加载到纹理中。将它们加载到纹理后,它们最初的格式无关紧要。

如果您仍未获得所需的性能,请尝试使用PIX来分析您的应用程序并找出瓶颈所在的位置。

修改

这太长了,不适合评论,所以我会编辑这篇文章。

当我说交换纹理时,我的意思是用SetTexture将它们绑定到纹理阶段。每次调用SetTexture时,都会因为它改变纹理阶段的状态而受到很小的性能影响。通常这种延迟相当小,但如果DirectX必须将纹理从系统内存拉到视频内存,那么延迟可能会很糟糕。

ID3DXsprite将重新排序开始和结束通话之间的绘制。这意味着SetTexture通常只会为每个纹理调用一次,无论您绘制它们的顺序如何。

通常值得将小纹理加载到大纹理中。例如,如果可以将所有小纹理适合一个大纹理,那么纹理阶段可以保持绑定到所有绘制的纹理。通常这会有明显的改善,但测试是确定它有多大帮助的唯一方法。它看起来很糟糕,但你可以抛出任何大的纹理并假装它是用来测试性能差异的组合。

答案 1 :(得分:2)

我同意dschaeffer,但我想补充一点,如果你使用大量不同的纹理,最好将它们一起刷在一个(或几个)较大的纹理上,并相应地调整不同精灵的纹理坐标。纹理状态变化花费了很多,这可能会加快旧系统的速度。