C++ 使用矢量存储DirectX9的顶点速度慢吗?

C++ 使用矢量存储DirectX9的顶点速度慢吗?,c++,vector,directx,vertex,vertex-buffer,C++,Vector,Directx,Vertex,Vertex Buffer,在过去的几天里,我制造了我的第一台发动机。一个带有窗口对象、图形对象和输入对象的中心对象——所有这些都很好,封装得很好。 在这个设置中,我还在图形对象中包含了一些处理一些“实用”功能的对象,如照相机和“vindex”管理器 顶点/索引管理器将所有顶点和索引存储在std::Vector中,在创建缓冲区时调用并发送到图形 唯一的问题是,我每秒只得到8-10个矩形的8帧。 我认为问题在于‘Vindex’对象我的着色器没有什么特别之处,而且管道相当普通 以这种方式存储顶点是一个糟糕的主意,还是我缺少了一

在过去的几天里,我制造了我的第一台发动机。一个带有窗口对象、图形对象和输入对象的中心对象——所有这些都很好,封装得很好。 在这个设置中,我还在图形对象中包含了一些处理一些“实用”功能的对象,如照相机和“vindex”管理器

顶点/索引管理器将所有顶点和索引存储在std::Vector中,在创建缓冲区时调用并发送到图形

唯一的问题是,我每秒只得到8-10个矩形的8帧。 我认为问题在于‘Vindex’对象我的着色器没有什么特别之处,而且管道相当普通

以这种方式存储顶点是一个糟糕的主意,还是我缺少了一些显而易见的东西

几年前,我做了一个进化模拟项目,代码非常混乱,但它在这台机器上以每秒100帧的速度渲染了20000个顶点,所以速度慢的不是我的机器

我已经盯着这个看了好几个小时了,非常感谢您的任何意见:

存储顶点的“我的对象”示例:

for (int i = 0; i < 24; ++i)
{
    mVertList.push_back(Vertex(v[i], n[i], col));
}
为了清楚起见

std::vector<Vertex> mVertList;
std::vector<int> mIndList;

在my graphics.cpp文件中:

md3dDevice->CreateVertexBuffer(mVinds.getVerts().size() * sizeof(Vertex), D3DUSAGE_WRITEONLY, 0, D3DPOOL_MANAGED, &mVB, 0);
Vertex * v = 0;
mVB->Lock(0, 0, (void**)&v, 0);

std::vector<Vertex> vList = mVinds.getVerts();

for (int i = 0; i < mVinds.getVerts().size(); ++i)
{
    v[i] = vList[i];
}

mVB->Unlock();


md3dDevice->CreateIndexBuffer(mVinds.getInds().size() * sizeof(WORD), D3DUSAGE_WRITEONLY, D3DFMT_INDEX16, D3DPOOL_MANAGED, &mIB, 0);

WORD* ind = 0;
mIB->Lock(0, 0, (void**)&ind, 0);

std::vector<int> iList = mVinds.getInds();

for (int i = 0; i<mVinds.getInds().size(); ++i)
{
    ind[i] = iList[i];
}

mIB->Unlock();

这里有相当多的复制:如果不运行探查器和更多的代码,我无法判断,但这似乎是第一个罪魁祸首:

std::vector<Vertex> vList = mVinds.getVerts();
std::vector<int> iList = mVinds.getInds();
这也是在移动和调整向量大小——在将内容放入向量之前,您很可能应该使用reserve或resize,以避免在数据的整个内存中重新分配和移动


如果我必须给你一个大的建议,那就是:个人资料。我不知道你可以使用什么工具,但是有很多分析器可用,选择一个并学习它,它将提供关于为什么你的程序很慢的更有价值的见解

我会查一下你提到的最初的复印材料,马上回来!天哪。对于一个特别大的场景来说,它从40秒的拍摄速度提高到了40帧每秒。谢谢您可以研究的另一件最有可能提高性能的事情是创建缓冲区。我不知道你到底想画什么,但通常情况下,对于给定的几何体,你可以只创建一次缓冲区,并在帧之间重用它,只更新顶点,但不更改它们的计数。这将提供一个巨大的速度,以及。有些情况下,当你想存储在内存中的顶点数据。但是,是否需要在应用程序中存储顶点?你多久用一次?你分析过你的应用程序吗?
std::vector<Vertex> vList = mVinds.getVerts();
std::vector<int> iList = mVinds.getInds();
mVertList.push_back(Vertex(v[i], n[i], col));