За последние несколько дней я изготовил свой первый «двигатель». Центральный объект с объектом окна, графическим объектом и входным объектом — все красиво, инкапсулировано и счастливо.
В эту настройку я также включил некоторые объекты в графический объект, которые обрабатывают некоторые «служебные» функции, такие как камера и менеджер «vindex».
Диспетчер вершин / индексов хранит все вершины и индексы в std :: vectors, которые вызываются и отправляются в графику, когда пора создавать буферы.
Единственная проблема в том, что я получаю ~ 8 кадров в секунду только с 8-10 прямоугольниками.
Я думаю, что проблема в объекте ‘Vindex’ (мой шейдер ничего особенного, а конвейер довольно ванильный).
Хранение Vertices таким способом — плохая идея, или есть какая-то болезненно очевидная вещь, по которой я скучаю?
Несколько лет назад я занимался небольшим проектом симуляции эволюции, который был довольно запутанным с точки зрения кода, но он рендерил 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));
Это также приводит к значительному изменению и изменению размеров векторов — вам, скорее всего, следует использовать резервирование или изменение размера, прежде чем помещать элементы в векторы, чтобы избежать перераспределения и перемещения по всей памяти ваших данных.
Однако, если я дам вам один большой совет, это будет: Профиль. Я не знаю, к каким инструментам у вас есть доступ, однако есть много доступных профилировщиков, выберите один и изучите его, и это даст гораздо более ценную информацию о том, почему ваша программа работает медленно.
Других решений пока нет …