Как правильно обновить вершинные буферы в DirectX 10 - PullRequest
4 голосов
/ 01 апреля 2011

Для справки: я работаю над проектом на C ++, в котором я пытаюсь рисовать трехмерные представления объектов на основе данных профиля в реальном времени.Данные профилирования собираются с внешнего оборудования профилирования.Система движется вдоль объекта и с частотой 300 раз в секунду предоставляет моему программному обеспечению срез профиля.Каждый срез состоит из списка ~ 8000 точек XY.Движение профилировщика записывается кодером.Информация о кодере обеспечивает 3-е измерение сканирования.

Еще одна важная вещь, которую следует отметить, - это то, что профилировщик может перемещаться по объекту взад-вперед.Когда это происходит, я хочу заменить ранее прочитанные / нарисованные фрагменты новыми (в зависимости от положения кодера).На данный момент я достигаю этого с помощью кругового буфера срезов, который я сохраняю по количеству кодировщиков.Это также означает, что я захочу выбросить фрагменты по мере заполнения буфера и начала перезаписи старых фрагментов.Для того, чтобы отобразить нужное количество предмета на экране - мне нужно нарисовать 1000 срезов данных профиля за раз.Сейчас я представляю объект как облако точек.В будущем мы можем попытаться присоединить соседние фрагменты и отобразить их в виде списка треугольников.

Я новичок в DirectX, но, используя книги и онлайн-примеры, я дошел до того, что рисую объект в 3D, но я убежден, что я неэффективно / правильно использую Vertex Buffers.Большинство примеров, которые я нашел, работают с очень статичными моделями.Поэтому они имеют тенденцию создавать единый буфер вершин со своим списком точек, а затем просто манипулируют матричными преобразованиями.Я, с другой стороны, буду очень быстро обновлять сцену, когда получаю данные профиля из нашего оборудования.

В настоящее время я создаю новый буфер вершин для каждого фрагмента, который я читаю. Когда я рисую сцену, яперебрать мой список до 1000 буферов и вызвать Draw () для каждого.Я заметил, что если я урезал вдвое количество буферов вершин, отображаемых за раз, мой FPS значительно увеличился, тогда как при уменьшении вдвое числа точек вершин на буфер было мало улучшений, поэтому я принимаю это как показатель того, что несколько буферов вершинэто неправильный способ приблизиться к этому.

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

Спасибо за ваше время.Любой совет будет высоко ценится!

1 Ответ

3 голосов
/ 01 апреля 2011

Вы всегда можете обновить точки в буфере вершин, если вы сделаете буфер динамическим (укажите D3D10_USAGE_DYNAMIC и используйте ID3D10Device::CopySubresourceRegion для эффективного обновления только частей буфера). Это должно быть более эффективным, чем повторное создание буферов слишком часто.

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

...