首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >缓冲direct3d绘图操作

缓冲direct3d绘图操作
EN

Stack Overflow用户
提问于 2011-12-31 07:34:28
回答 1查看 161关注 0票数 0

这个问题是2D特定的。

我是一个不断更新的纹理,它是我的一个层的渲染目标。更新是整个纹理的重绘,通过绘制精灵和输出文本来执行。这个操作经常被执行,消耗了相当多的CPU,当然,我已经优化了重绘的次数来降低它。

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

对我来说最好的办法就是创建一个可修改的绘制链对象,但我还没有在Direct3D中找到这样的东西。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-31 07:49:24

您可以研究以下几种常规方法:

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

至于实际的缓冲,驱动程序将在适当的时间和地点为您处理。状态块可以通过在单个调用中传递所有模式来影响缓冲(我忘记了它是好是坏,尽管我相信它们是有益的)。减少对以下各项的调用:

代码语言:javascript
复制
if (sprite.Visible && Active(sprite) && OnScreen(sprite))
{
    states[sprite.Type]->Apply(); 
    device->BindTexture(sprite.Texture); 
    device->SetVertexShaderF(sprite.PositionSize); 
    device->Draw(quad);
}

很可能对CPU的使用有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8685053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档