【问题标题】:DirectX9, DirectDraw, Optimization?DirectX9,DirectDraw,优化?
【发布时间】:2010-02-17 17:06:26
【问题描述】:

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

在我的电脑上(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++ 如此陌生。

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

【问题讨论】:

    标签: c++ optimization directx directdraw


    【解决方案1】:

    你需要一个分析器。

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

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

    【讨论】:

    • Pix 对于优化 DirectX btw 非常有用。但是,您需要对 DirectX 的工作原理有一个很好的理解才能看到性能问题。否则,如果您使用的是 nVidia 卡,NV 的 Perf HUD 就是笨蛋。
    【解决方案2】:

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

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

    【讨论】:

    • 我将不得不更多地研究 Instancing 和 dX,因为从我所读到的内容(诚然还不够)我不确定我会如何用 sprite 做这样的事情。我知道你从哪里来,我只需要更多地调查一下。
    【解决方案3】:

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

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

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

    【讨论】:

    • 将它们添加到向量的末尾然后对其进行排序通常更快。只要排序只在一帧中发生一次,这可以提供很好的性能提升。
    • 我正在创建对象并将它们添加到向量的末尾。它们以随机的速度和随机的方向移动。一旦它们到达定义的矩形之外的任何区域,它们就会被移除。意思是,它们将从数组中的任何位置删除,而不仅仅是末尾。这仍然需要使用列表吗?
    • 是的,从向量中的随机位置移除仍然有很大的成本。请注意,列表也有其成本,所以如果不是太麻烦,我建议至少尝试一下,看看有什么区别。
    【解决方案4】:

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

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

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

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

    就是这样。 :P

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-12
      • 1970-01-01
      • 1970-01-01
      • 2020-03-13
      • 1970-01-01
      • 1970-01-01
      • 2012-06-15
      相关资源
      最近更新 更多