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

0

За последние несколько дней я сделал свой первый "двигатель". Центральный объект с объектом окна, графическим объектом и входным объектом - все красиво и инкапсулировано и счастливо. В этой настройке я также включил некоторые объекты в графический объект, который обрабатывает некоторые функции "утилиты", такие как камера и менеджер "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();
  • 0
    Есть ситуации, когда вы хотите сохранить данные вершин в памяти. Но нужно ли вообще хранить вершины в вашем приложении ? Как часто вы используете это? Вы профилировали свое приложение?
Теги:
vector
directx
vertex
vertex-buffer

1 ответ

0
Лучший ответ

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

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

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

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

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

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

  • 0
    Я проверю начальный материал для копирования, который вы упомянули, вернусь через секунду!
  • 0
    Святой ад. Для особенно масштабной сцены это заняло более 40 секунд и 40 кадров в секунду. Спасибо!
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню