我是这方面的新手。我正在写一本书,它向我展示了如何使用D3D9,以及如何创建一个顶点缓冲区并从中绘制一个立方体。我在c++中创建了一个类,它包装了绘制单个立方体所需的内容。表示每个立方体对象创建自己的顶点缓冲区,并存储指向顶点缓冲区、位置、旋转和缩放值的指针。
问题是,这100k的绘制速度非常慢。如果我尝试绘制这个100k的立方体,我只能得到~2-3 FPS (使用Nvidia GTX 970)
我没有在这里写我的长代码,而是决定只显示我绘制立方体的当前步骤,因为我认为已经有错误了。如果代码是真的需要,那么我会添加它的。K是重要的步骤:
//为单个立方体obj对象创建vertexbuffer:
1.) pDevice->CreateVertexBuffer() //using: D3DUSAGE_WRITEONLY
2.) pVertexBuffer->Lock()
3.) memcpy() //copy stuff into vertexbuffer
4.) pVertexBuffer->Unlock();//绘制一个立方体对象(我在一个运行100k立方体的for循环中调用这个东西):
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都使用相同的vertexbuffer),那么我得到的fps (~30FPS)比idk多10倍。100k立方体对我来说听起来还是不多(100k立方体和只有30FPS的O_o?)我认为我做了一些完全错误的事情:
有人知道我的错误在哪里吗?
发布于 2015-05-31 16:57:15
您应该将顶点缓冲区设置为静态,除非它需要是动态的。GPU可以使用这些信息来帮助优化。
虽然你的显卡可以做数百万个三角形,但它不能做数百万个绘图调用。单个绘图调用非常昂贵,稍后您将尝试最小化图形卡上的所有状态更改。
正如评论中提到的,实例化是渲染许多相同事物的一种方法。你也可以将所有的立方体合并在一起,并在一个镜头中渲染(这在一定程度上就是我的世界所做的)。
还有其他方法,但这取决于你试图实现的目标。有些人比其他人参与得更多。
https://stackoverflow.com/questions/30555130
复制相似问题