4

我正在尝试创建一个平台游戏,我正在使用各种精灵块,并将它们拼凑在一起以绘制关卡。这需要每帧在屏幕上绘制大量精灵。一台好的计算机在处理所有精灵的绘制时没有问题,但它开始影响旧计算机的性能。由于这不是一款大型游戏,我希望它能够在几乎任何计算机上运行。现在,我正在使用以下 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 中绘制精灵最性能友好的方式是什么?谢谢!

4

2 回答 2

4

您正在使用的 ID3DXSPRITE 界面已经非常高效。如果可能的话,确保所有精灵绘制调用在精灵开始和结束调用之间发生。这允许精灵界面以最有效的方式安排绘制。

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

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

只要将它们预加载到纹理中,您用于纹理的文件类型就无关紧要。确保在加载游戏/关卡时将它们全部加载到纹理中。一旦将它们加载到纹理中,它们最初的格式就无关紧要了。

如果您仍然没有获得所需的性能,请尝试使用 PIX 来分析您的应用程序并找出真正的瓶颈所在。

编辑:

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

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

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

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

于 2011-07-01T21:15:25.177 回答
2

我同意 dschaeffer 的观点,但想补充一点,如果您使用大量不同的纹理,最好将它们混合在一个(或几个)较大的纹理上,并相应地调整不同精灵的纹理坐标。纹理化状态更改成本很高,这可能会加快旧系统的速度。

于 2011-07-01T21:43:49.300 回答