D3D9从Vertexbuffer绘制100k立方体非常慢

时间:2015-05-31 07:57:06

标签: c++ 3d directx direct3d

我是这个东西的新手。我正在使用一本书来向我展示如何使用D3D9以及如何创建顶点缓冲区并从中绘制一个立方体。我用c ++创建了一个类,它包装了绘制单个多维数据集所需的东西。意味着每个立方体对象创建自己的顶点缓冲区并将指针存储到顶点缓冲区,位置,旋转和缩放值。

问题是这个100k的绘制非常慢。如果我尝试绘制这个100k立方体(使用Nvidia GTX 970),我只能得到~2-3 FPS

我没有在这里编写我的长代码,而是决定只显示我正在绘制多维数据集的当前步骤,因为我认为已经存在错误。如果代码真的需要,那么我肯定会添加它。 K是重要的步骤:

//为单个多维数据集创建vertexbuffer obj对象:

1.) pDevice->CreateVertexBuffer() //using: D3DUSAGE_WRITEONLY
2.) pVertexBuffer->Lock()
3.) memcpy() //copy stuff into vertexbuffer
4.) pVertexBuffer->Unlock();

//绘制一个立方体对象(这个东西我在一个for循环中调用,运行100k立方体):

1.) pDevice->SetFVF()
2.) pDevice->SetStreamSource() //to use the cube's vertexbuffer
3.) create rotation-, translation- and scalingmatrix
4.) create world matrix from the matrix above
5.) pDevice->SetTransform() //use the worldmatrix
6.) pDevice->DrawPrimitive()

我发现如果我将vertexbuffer设为静态(意味着所有100k使用相同的顶点缓冲区),那么我获得10倍fps(~30FPS)但是idk .. 100k立方体声音对我来说仍然不多(100k立方体)只有30FPS O_o?)。我认为我做的事总错了:/

有人知道我的错误吗?

1 个答案:

答案 0 :(得分:2)

除非需要动态,否则应该使顶点缓冲区保持静态。 GPU可以使用该信息来帮助优化。

虽然你的显卡可以制作数百万个三角形,但它无法进行数百万次绘制调用。单次绘制调用非常昂贵,稍后您将尝试最小化图形卡上的所有状态更改。

正如评论中所提到的那样,实例化是提供许多同样事物的一种方式。您还可以将所有立方体合并在一起并一次渲染(这是Minecraft在某种程度上所做的)。

还有其他方法,但这取决于您要实现的目标。有些人比其他人更多参与。