2

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

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

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

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

我无法想象为数组更改向量,因为我每帧都在以一种不确定的方法从向量中推拉东西。几乎是随机的。

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

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

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

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

4

4 回答 4

5

你需要一个分析器。

回复中有一些很好的性能建议,但这并不重要。尝试在没有分析器的情况下优化程序就像尝试在没有编译器的情况下编写程序一样。不要猜测,测量。

话虽如此,分析图形代码是一个臭名昭著的痛苦,并且(据我所知)没有任何好的免费工具可以帮助解决它。所以暂时不要介意:从一个普通的 CPU 分析器开始,找出你的哪些调用真正占用了你所有的时间。

于 2010-02-17T19:53:46.637 回答
1

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

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

于 2010-02-17T17:31:56.470 回答
1

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

1)如果是CPU,您可以尝试实例化以减少draw call的数量。或者,如果您的目标机器不支持硬件实例化,请尝试一种批处理。要实例化或批处理精灵,您必须像默认界面一样使用 QUAD(面向 2 个三角形)。

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

3) 如果是 BUS,请尝试对 CPU 进行处理,与批处理一样,您可以减少传输数据所需的锁定/解锁次数。(通过实例化,您根本不需要更新缓冲区)

就这样。:P

PS 警告...不要尝试使用 CPU 分析器分析 DirectX 调用。(但使用 nVidia 的 PerfHud 或 ATI 的 GPUPerfStudio,或 Intel 的 GPA)它只是时间损失了,DirectX 有一个命令缓冲区,你不能保证现在调用它会在那个时候执行。大多数时候它会立即返回并且什么也不做。

于 2010-02-18T08:58:46.240 回答
1

我无法想象为数组更改向量,因为我每帧都在以一种不确定的方法从向量中推拉东西。几乎是随机的。

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

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

于 2010-02-17T17:45:53.227 回答