0

问题是 2D 特定的。

我是一个不断更新的纹理,它是我的一个图层的渲染目标。更新是对纹理的整体重绘,通过绘制精灵和输出文本来执行。该操作执行频繁,消耗大量 CPU,当然,我优化了重绘次数以降低它。

有没有办法在 Direct3D 中缓冲这些操作?因为目前我必须重复构建一个精灵/文本操作链。让我们假设任何执行世界更新的游戏 - 他们如何克服这项繁琐的工作?也许通过创建更多层?

对我来说最好的事情是创建一个可修改的绘制链对象,但我在 Direct3D 中没有找到类似的东西。

4

1 回答 1

1

您可能会研究一些通用方法:

  • 批处理:排序和组合绘制以执行尽可能少的调用,并在状态更改之间绘制尽可能多的对象。
  • 缓存:在顶点缓冲区中保留尽可能多的几何图形。对于 2D,这变得更有趣,因为大多数东西都是带纹理的四边形。在这种情况下...
  • 着色器:可以编写一个顶点着色器,它采用 float4 给出四边形的 X/Y 位置/大小,然后用它来绘制 4 个顶点。然后,您不需要执行完整的矩阵状态更改,只需更新着色器中的 4 个浮点数(跳过所有视图计算,减少 75% 的内存和数学运算)。为了帮助确保着色器使用正确的设置,...
  • 状态块:为每种类型的精灵保存一个状态块,绑定所有颜色、模式和着色器。然后简单地应用状态块,绑定你的纹理,设置你的坐标,然后绘制。充其量,您可以将每个精灵减少到 4 个调用。甚至还...
  • Cull:最好不要画东西。如果您可以进行简单的屏幕边界检查(可以比其他情况下进行的每个多边形剔除更快),排序和基本遮挡(具有透明度的标志精灵)。对于 2D,大多数剔除检查非常便宜。尽可能进行排序、剪辑和剔除。

就实际缓冲而言,驱动程序将在适当的时间和地点为您处理。状态块可以通过在一次调用中提供所有模式来影响缓冲(我忘记了它是好是坏,尽管我相信它们可能是有益的)。减少调用:

if (sprite.Visible && Active(sprite) && OnScreen(sprite))
{
    states[sprite.Type]->Apply(); 
    device->BindTexture(sprite.Texture); 
    device->SetVertexShaderF(sprite.PositionSize); 
    device->Draw(quad);
}

很可能有助于 CPU 使用。

于 2011-12-30T23:49:24.307 回答