DirectX9,DirectDraw,优化?

时间:2010-02-17 17:06:26

标签: c++ optimization directx directdraw

首先,我正在编写游戏。目前在渲染功能中有两个不同函数的调用。一个呈现一些文本,一个呈现精灵。

在我的电脑上(AMD Phenom(TM)II X4 955处理器(4个CPU),~3.2GHz,4096MB RAM DDR2,NVIDIA GeForce GTX 285)当渲染大约200个精灵时,我的渲染速度约为2200 FPS渲染约14,500时,100 FPS。

我正在使用一个向量来存储我正在渲染的每个对象的信息,并使用一个带有许多绘制调用的精灵。

VS2008发布模式,完全优化了C ++。我知道我听说过左右不要过早地进行优化,但是在这一点上,它对我来说很好,但在某些计算机上运行得不是很好。

我无法想象为数组改变向量,因为我是以不确定的方法从每个帧推送和拉动向量。几乎是随机的。

我尝试过浮动和双打,速度没有什么不同。

使用DirectDraw而不是DirectX和Sprite Render方法会有所不同吗?由于我不知道DirectDraw和DirectX之间的区别,我不是100%我应该考虑的事情。

游戏在普通计算机上运行良好,但我比较我的游戏是东方。在我试过的最弱的电脑上,东方以60 FPS的速度运行,但我的游戏速度不会超过36~42 FPS。我无法想象我做错了什么,对DirectX和C ++这么新。

在这件事上的任何帮助都会很棒,不幸的是,我不会在一段时间内添加信息或回答问题。

4 个答案:

答案 0 :(得分:5)

你需要一个分析器。

在回复中有一些很好的表现建议,但没关系。尝试在没有探查器的情况下优化程序就像尝试编写没有编译器的程序一样。不要猜测,衡量。

现在说,分析图形代码是一个臭名昭着的痛苦,并没有(据我所知)任何好的,免费的工具来帮助它。所以现在不用担心:从一个普通的CPU分析器开始,找出你的哪些呼叫真的占用你所有的时间。

答案 1 :(得分:1)

  

我正在使用向量来存储我正在渲染的每个对象的信息并使用一个   带有很多绘制调用的精灵。

我不确定我理解你在说什么,但这听起来好像你在很多不同的地方绘制了相同的对象。如果是这种情况,您可能想要查找DirectX Instancing。基本思想是指定1)要绘制的几何体,以及2)绘制它的多个位置。这样可以在每次绘制对象时保存重新指定几何体,因此可以显着提高速度。

答案 2 :(得分:1)

  

我无法想象为数组改变向量,因为我是以不确定的方法从每个帧推送和拉动向量。几乎是随机的。

您是否从矢量背面以外的位置插入和/或移除东西?在向量中,插入和从中间移除需要O(n)时间,也就是说,它所花费的时间量与向量的大小成正比。

如果是这种情况,请考虑使用std::list。请注意,对于10k +对象,这很容易导致性能问题,具体取决于您执行此操作的频率。

答案 3 :(得分:1)

描述您的应用程序,并确定您的瓶颈是CPU还是GPU(或两者之间的传输总线) 确定后,您有几个选择:

1)如果是CPU,你可以尝试实例化以减少绘制调用的次数。或者,如果您的目标计算机不支持硬件实例化,请尝试一种批处理。要实例化或批量生成精灵,您必须使用QUAD(面向三角形)作为默认界面。

2)如果是GPU,请尝试了解它的着色器是否导致减速。如果是这种情况,请尝试优化它。如果它不是着色器,请尝试减少透支。如果使用前后绘图,对象的一部分不透明。

3)如果是BUS,请尝试按照CPU进行操作,就像批量一样,减少传输数据所需的锁定/解锁次数。 (通过实例化,您根本不需要更新缓冲区)

这就是全部。 :P

P.S。警告......不要尝试使用CPU分析器调查DirectX调用。 (但使用来自nVidia的PerfHud或来自ATI的GPUPerfStudio,或来自英特尔的GPA) 它刚刚失去时间,DirectX有一个命令缓冲区,你不能确定现在执行的调用是在那个时间执行的。大部分时间它会立即返回并且什么也不做。