使用向量来存储DirectX9的顶点速度慢吗?

时间:2013-12-24 14:50:10

标签: c++ vector directx vertex vertex-buffer

在过去的几天里,我制作了第一个“引擎”。一个带有窗口对象,图形对象和输入对象的中心对象 - 所有这些都很好,封装和快乐。 在这个设置中,我还在图形对象中包含了一些处理某些“实用程序”功能的对象,比如摄像头和“vindex”管理器。

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

唯一的问题是我每秒只能获得8帧,只有8-10个矩形。 我认为这个问题出现在'Vindex'对象中(我的着色器并不引人注目,而且管道很香草)。

以这种方式存储顶点是一个糟糕的主意,还是只有一些我不知道的显而易见的事情?

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

我已经好好盯着这几个小时,所有的输入都非常感激:)

来自存储顶点的对象的示例:

for (int i = 0; i < 24; ++i)
{
    mVertList.push_back(Vertex(v[i], n[i], col));
}

为了清晰起见

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

std::vector<Vertex> VindexPile::getVerts()
{
    return mVertList;
}
std::vector<int> VindexPile::getInds()
{
    return mIndList;
}

在我的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();

1 个答案:

答案 0 :(得分:0)

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

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

这两个调用会创建顶点/索引缓冲区的副本,这很可能不是你想要的 - 你很可能想要将它们声明为const引用。您还通过执行这些副本来破坏缓存一致性,这会使您的程序变得更慢。

mVertList.push_back(Vertex(v[i], n[i], col));

这也正在移动和调整向量的大小 - 你应该最好使用保留或调整大小,然后将东西放入向量中,以避免重新分配并在整个数据存储器中移动。

如果我必须给你一个重要的建议,那就是:个人资料。我不知道您可以访问哪些工具,但是有很多可用的分析器,选择一个并学习它,它将提供更有价值的洞察力来解释您的程序运行缓慢的原因。