首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >DirectX9 -高效绘制精灵

DirectX9 -高效绘制精灵
EN

Stack Overflow用户
提问于 2011-07-02 02:16:12
回答 2查看 3.2K关注 0票数 4

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

代码语言:javascript
运行
复制
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中绘制精灵的最好的性能方法是什么?谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-02 05:15:25

您正在使用的ID3DXSPRITE接口已经相当高效了。如果可能,在sprite begin和end调用之间,确保所有的sprite绘制调用都发生在一个批处理中。这允许sprite界面以最有效的方式排列绘图。

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

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

用于纹理的文件类型并不重要,只要它们已预加载到纹理中即可。确保在加载游戏/关卡时将它们全部加载到纹理中一次。将它们加载到纹理中后,它们最初采用的格式并不重要。

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

编辑:

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

当我说交换纹理时,我指的是使用SetTexture将它们绑定到纹理阶段。每次调用SetTexture都会有一个小的性能损失,因为它改变了纹理阶段的状态。通常情况下,此延迟相当小,但如果DirectX必须将纹理从系统内存拉到视频内存,则延迟可能会很糟糕。

ID3DXsprite将为您重新排序begin和end调用之间的抽签。这意味着,无论绘制纹理的顺序如何,通常只会为每个纹理调用一次SetTexture。

将小纹理加载到大纹理中通常是值得的。例如,如果可以将所有的小纹理都放入一个大的纹理中,那么纹理阶段就可以在所有绘图中都绑定到该纹理。通常情况下,这会带来明显的改进,但测试是确定它会有多大帮助的唯一途径。它看起来很糟糕,但你可以简单地加入任何大的纹理,并假装它是组合在一起的纹理,以测试会有什么性能差异。

票数 4
EN

Stack Overflow用户

发布于 2011-07-02 05:43:49

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6551714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档