Является ли использование векторов для хранения вершин для DirectX9 медленным?

За последние несколько дней я изготовил свой первый «двигатель». Центральный объект с объектом окна, графическим объектом и входным объектом — все красиво, инкапсулировано и счастливо.
В эту настройку я также включил некоторые объекты в графический объект, которые обрабатывают некоторые «служебные» функции, такие как камера и менеджер «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();

0

Решение

Здесь происходит довольно много копирования: я не могу сказать, не запустив профилировщик и еще немного кода, но это кажется первым виновником:

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

Эти два вызова создают копии ваших буферов вершин / индексов, что, скорее всего, не то, что вам нужно — вы, скорее всего, захотите объявить их как ссылки на const. Вы также нарушаете целостность кэша, делая эти копии, что еще больше замедляет вашу программу.

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

Это также приводит к значительному изменению и изменению размеров векторов — вам, скорее всего, следует использовать резервирование или изменение размера, прежде чем помещать элементы в векторы, чтобы избежать перераспределения и перемещения по всей памяти ваших данных.

Однако, если я дам вам один большой совет, это будет: Профиль. Я не знаю, к каким инструментам у вас есть доступ, однако есть много доступных профилировщиков, выберите один и изучите его, и это даст гораздо более ценную информацию о том, почему ваша программа работает медленно.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]