【问题标题】:Low performance when drawing large sprite with directX 10使用 directX 10 绘制大型精灵时性能低下
【发布时间】:2013-09-20 16:06:31
【问题描述】:

我一直在使用http://rastertek.com/ 上的教程在 c++ 中开发 DirectX 10 2D 引擎 我的精灵系统基于http://rastertek.com/dx10tut11.html,并且一直运行良好,直到我尝试渲染大小为 1920x1080 的背景纹理。

我遇到的问题是 FPS 从 3000 下降到 1800,但如果我将较小的纹理仅绘制到 2800 左右。 我知道绘制大纹理总是会对性能产生影响,但必须有一种方法来优化这一点。 首先,我认为它与顶点缓冲区是动态的有关,但是将其更改为默认值并不能优化性能。 着色器代码非常简单:根据视图矩阵计算顶点的位置,像素着色器使用纹理坐标来绘制它们。 我一直在考虑只使用 DirectX 10 中包含的 D3DXSPRITE 系统,但它已在 DirectX 11 中被取消,所以我决定不使用它。

所以经过这么长的解释后,我的问题是:如何优化我的代码以绘制大纹理?您有什么建议使用的解决方案吗?

【问题讨论】:

    标签: c++ directx textures sprite


    【解决方案1】:

    链接中的教程表明您应该在绘制精灵时禁用 Z 缓冲区。只有在进行 alpha 混合时,这才是正确的。为了优化绘制大型精灵,您应该启用 Z 缓冲区,并从前到后绘制批次(尽可能大)不透明精灵,同时保持 alpha 混合精灵的从后到前的顺序。这有助于避免过度绘制,这可能是您看到的帧速率下降的原因。

    例如,如果您有一些不透明 (Oi) 和 alpha 混合 (Ai) 的精灵想要按此顺序渲染:

    O1 O2 O3 A1 A2 O4 O5 O6 A3 A4 O7

    你应该这样渲染它们:

    [Z-启用] O3 O2 O1 [Z-禁用] A1 A2 [Z-启用] O6 O5 [z-禁用] A3 A4 O7

    如果您想进一步优化,您可以进行边界检查以查看精灵是否重叠。如果他们不这样做,您可以合并批次,但这无助于透支,因为您一开始就没有任何批次。

    所以以上内容应该可以帮助您优化性能,但这里有一些其他半相关的提示:

    • 不要专注于以荒谬的帧速率进行优化。相反,尝试增加工作负载,直到达到 60-120 FPS 左右,然后进行优化。显示驱动程序旨在达到 60FPS,如果您的渲染速度更快,甚至可以缩减性能以节省电量。
    • 除非您迫切需要以 Windows Vista RTM 为目标,否则您应该切换到 Direct3D 11(在应用了一些 Windows 更新的 Vista 上支持,并且本机支持 Windows 7+)。它基本上是相同的 API,只是速度更快,支持更好。
    • 看看DirectX Tool Kit 的SpriteBatch 实现。它可能满足您的所有需求,并以 D3D11 为核心。

    【讨论】:

    • 感谢您的详尽解释。我不知道透支这绝对是我遇到的问题之一。问题是,当只绘制一个精灵时也会出现这个问题。我尝试启用 Z 缓冲区并禁用 alpha 混合,但性能似乎没有差异。使用投影矩阵绘制大纹理会有所不同吗?切换到 Direct3D 11 是正确的。因为引擎仍然很小,所以应该不难。它提供的 SpriteBatch 看起来很有前途。
    • @Tobbi 即使只绘制单个精灵,绘制大精灵总是比绘制小精灵更昂贵,因为“填充率”是有限制的,即像可以读取或写入渲染目标。对于精灵渲染等计算简单的工作负载,填充率几乎总是瓶颈。
    • 是的,大精灵比小精灵更昂贵是有道理的。我只是没想到它会如此戏剧化。经过一番研究后,我发现“每秒帧数”并不能为您提供准确的性能尺度。我现在使用“帧时间”,性能影响似乎不再那么大了。我还更新到 Direct3d 11 并更改了纹理压缩。这样做节省了大量的帧时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2018-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多