За последние несколько дней я сделал свой первый "двигатель". Центральный объект с объектом окна, графическим объектом и входным объектом - все красиво и инкапсулировано и счастливо. В этой настройке я также включил некоторые объекты в графический объект, который обрабатывает некоторые функции "утилиты", такие как камера и менеджер "vindex".
Vertex/Index Manager хранит все вершины и индексы в std :: векторах, которые вызываются и отправляются на графику при создании буферов.
Единственная проблема заключается в том, что я получаю ~ 8 кадров в секунду, всего 8-10 прямоугольников. Я думаю, проблема в объекте "Vindex" (мой шейдер ничто не впечатляет, а конвейер довольно ванильный).
Хранит ли Вершины таким образом плохую идею сливы, или есть только какая-то больно очевидная вещь, которую я пропускаю?
Несколько лет назад я сделал небольшой проект эволюции, который был довольно грязным по коду, но он отображал 20 000 вершин на 100 секунд кадров на этой машине, поэтому это не моя машина, которая замедляется.
Я как бы смотрел на это несколько часов, все и вся информация ОЧЕНЬ высоко ценится :)
Пример из моего объекта, который хранит мои вершины:
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();
Здесь происходит довольно много копий: я не могу сказать, не запуская профайлер и еще какой-то код, но это похоже на первого виновника:
std::vector<Vertex> vList = mVinds.getVerts();
std::vector<int> iList = mVinds.getInds();
Эти два вызова создают копии ваших вершинных/индексных буферов, что, скорее всего, не то, что вы хотите - вы, скорее всего, хотите объявить их как ссылки на const. Вы также разрушаете когерентность кеша, делая эти копии, что замедляет вашу программу больше.
mVertList.push_back(Vertex(v[i], n[i], col));
Это перемещение и изменение размеров векторов довольно много - вы должны, скорее всего, использовать резерв или изменить размер перед помещением материала в свои векторы, чтобы избежать перераспределения и перемещения по всей памяти ваших данных.
Однако, если я должен дать вам один большой совет, это будет: Профиль. Я не знаю, какие инструменты у вас есть, но есть много профилировщиков, выберите один и изучите его, и он предоставит гораздо более ценное представление о том, почему ваша программа работает медленно.