缓冲direct3d绘制操作

时间:2011-12-30 23:34:28

标签: 2d direct3d direct3d9

问题是2D特定的。

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

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

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

1 个答案:

答案 0 :(得分:1)

您可能会考虑一些常规方法:

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

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

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

很可能有助于CPU使用。