在过去的几天里,我制作了第一个“引擎”。一个带有窗口对象,图形对象和输入对象的中心对象 - 所有这些都很好,封装和快乐。 在这个设置中,我还在图形对象中包含了一些处理某些“实用程序”功能的对象,比如摄像头和“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();
答案 0 :(得分:0)
这里有相当多的复制:如果不运行探查器和更多代码,我无法分辨,但这似乎是第一个罪魁祸首:
std::vector<Vertex> vList = mVinds.getVerts();
std::vector<int> iList = mVinds.getInds();
这两个调用会创建顶点/索引缓冲区的副本,这很可能不是你想要的 - 你很可能想要将它们声明为const引用。您还通过执行这些副本来破坏缓存一致性,这会使您的程序变得更慢。
mVertList.push_back(Vertex(v[i], n[i], col));
这也正在移动和调整向量的大小 - 你应该最好使用保留或调整大小,然后将东西放入向量中,以避免重新分配并在整个数据存储器中移动。
如果我必须给你一个重要的建议,那就是:个人资料。我不知道您可以访问哪些工具,但是有很多可用的分析器,选择一个并学习它,它将提供更有价值的洞察力来解释您的程序运行缓慢的原因。