D3D9 отрисовывает 100 тыс. Кубов из Vertexbuffer очень медленно
Я новичок в этом деле. Я работаю с книгой, которая показывает мне, как использовать D3D9 и как создать вершинный буфер и нарисовать из него куб. Я создал класс в C++, который упаковывает необходимые вещи для рисования одного куба. Означает, что каждый объект куба создает свой собственный вершинный буфер и сохраняет указатель на значения вершинного буфера, pos, вращения и масштабирования.
Проблема в том, что отрисовка этих 100к очень медленная. Я получаю только ~2-3 FPS, если я пытаюсь нарисовать эти 100k кубов (с Nvidia GTX 970)
Вместо того чтобы писать здесь длинный код, я решил показать только текущие шаги, которые я делаю, чтобы нарисовать куб, потому что я думаю, что ошибка уже есть. Если код действительно нужен, я обязательно добавлю его. К, которые являются важными шагами:
// создаем вершинный буфер для одного куба obj Object:
1.) pDevice->CreateVertexBuffer() //using: D3DUSAGE_WRITEONLY
2.) pVertexBuffer->Lock()
3.) memcpy() //copy stuff into vertexbuffer
4.) pVertexBuffer->Unlock();
// рисуем объект куба (эта штука вызывается в цикле for, который работает с кубами 100k):
1.) pDevice->SetFVF()
2.) pDevice->SetStreamSource() //to use the cube's vertexbuffer
3.) create rotation-, translation- and scalingmatrix
4.) create world matrix from the matrix above
5.) pDevice->SetTransform() //use the worldmatrix
6.) pDevice->DrawPrimitive()
Я обнаружил, что если я сделаю vertexbuffer статическим (то есть все 100k используют один и тот же vertexbuffer), тогда я получу в 10 раз больше fps (~30FPS), но idk.. 100k кубов звучит для меня все же немного (100k кубов и только 30FPS) O_o?). Я думаю, что я делаю что-то не так:/
У кого-то есть идея в чем моя ошибка?
1 ответ
Вы должны сделать ваш вершинный буфер статическим, если он не требует динамичности. Графический процессор может использовать эту информацию для оптимизации.
В то время как ваша видеокарта может выполнять миллионы треугольников, она не может выполнять миллионы вызовов отрисовки. Один вызов на отрисовку довольно дорогой, и позже вы попытаетесь минимизировать все изменения состояния видеокарты.
Как уже упоминалось в комментариях, создание экземпляров - это один из способов визуализации многих вещей. Вы также можете объединить все кубы вместе и сделать рендеринг за один выстрел (это то, что делает Minecraft в некоторой степени).
Есть и другие методы, но это зависит от того, чего вы пытаетесь достичь. Некоторые из них более вовлечены, чем другие.