Обновление буфера вершин DirectX 9.0 - PullRequest
4 голосов
/ 02 марта 2012

Я сделал небольшое приложение для просмотра 3D, используя DirectX 9.0.Теперь я хотел бы добавить некоторые функции редактирования.Предположим, что я хочу редактировать большой полигон.Пока пользователь редактирует форму, вершины будут добавляться, удаляться и перемещаться.Прямо сейчас каждый полигон хранится как буфер вершин.Мой вопрос: как лучше всего сохранить и отобразить форму, пока пользователь ее редактирует?Если я уничтожаю и воссоздаю буфер вершин каждый раз, когда происходит изменение, я считаю, что оно будет слишком ресурсоемким и неоптимальным.вот они:

У меня есть три разные задачи, две из которых я не знаю, как реализовать:
1) Редактирование вершины: Легко, я просто обновлю старую вершину с помощьюновая позиция в VB.
2) Удаление вершины: что здесь происходит?Как мне удалить его, не создавая новый VB?Должен ли я просто добавить пустой VB?
3) Добавление вершины: А что здесь?Могу ли я изменить длину динамического VB и добавить вершины в конце?

Еще одна мысль, которая, как мне кажется, сработает:
1) Редактирование легко
2) Удаление будет означать, что я перезапишу удаленную вершину, возможно, с позициейпредыдущая или следующая вершина, поэтому она не будет видна.
3) Добавление создаст новый буфер вершин, но изменит размер как вектор или список.Каждый раз, когда он воссоздается, его размер будет примерно таким:
NewSize = OldSize * 1.1 (добавление на 10% больше)
, так что последовательные добавления не должны заново создавать VB.
Итак 1 & 2Никогда не создавайте новый VB, и 3 могут иногда создавать его.Как это звучит?

1 Ответ

4 голосов
/ 02 марта 2012

Вам не нужно уничтожать буфер каждый кадр. Создать динамический буфер.

Ознакомьтесь со статьей Использование буферов вершин с DirectX , если вы еще этого не сделали:

Для динамических буферов вершин, которые содержат информацию о примитивах, которые часто меняются в сцене, нам нужно указать флаги D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY для использования и флаг D3DPOOL_DEFAULT для пула.

Помните, однако, что данные по-прежнему должны отправляться в конвейер для каждого обновления. Таким образом, определенно будут некоторые затраты производительности по сравнению со статическими буферами с согласованными данными.

Также вам следует постараться сохранить минимальные обновления буфера, а также переключатели буфера. Много ли таких редактируемых полигонов в вашем приложении? Если ответ да , возможно, стоит рассмотреть возможность помещения их в один буфер.


Официальный сайт Q / A для разработчиков графики / игр: https://gamedev.stackexchange.com/


Обновление

Звучит довольно хорошо для меня.

Динамические вершинные буферы, с другой стороны, заполняются и отбрасываются в каждый кадр.

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

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

Когда дело касается графической производительности, параметров так много, что почти невозможно дать однозначные ответы. Вы уже сталкиваетесь с ограничениями? Если нет, не беспокойтесь слишком сильно. Будьте щедрыми со своими ресурсами, пока вы все еще развиваетесь.

...