Рисование объектов в Direct3D 11 с различным количеством примитивов

это мой первый вопрос, так что если у вас есть предложения по улучшению вопроса, не стесняйтесь, сообщите мне 🙂

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

Вот некоторые из идей, которые у меня были:

  1. Создайте буфер вершин размера N, и просто передать вершины в пучках N. Недостатки: некоторые вершины проходят через VS несколько раз, поэтому небольшое снижение производительности (вероятно, не заметно), из-за чего приходится вызывать Map / Unmap несколько раз за кадр, что может быть проблематично.

  2. Создайте огромный буфер вершин, в котором будет достаточно вершин, чтобы мой объект никогда не превышал размер буфера. Недостатки: поскольку я не знаю заранее, сколько вершин будет иметь мой объект, может быть трудно предсказать размер этого буфера. Кроме того, буфер может занять слишком много места в результате.

  3. В каждом кадре создайте новый буфер вершин правильного размера и вызовите IASetVertexBuffer. Недостатки: это, вероятно, будет иметь огромные проблемы с производительностью …

Буду признателен за любые идеи, которые есть у ваших парней, или за предложения, какие из этих трех использовать! 🙂

1

Решение

1 / Это не идеально, так как, как вы сказали, вам нужно отображать / снимать карты несколько раз и делать между ними вызовы. Вы делаете компромисс, чтобы потерять производительность для меньшего использования памяти, на современной карте (считая в гигабайтах данных) память вряд ли будет проблемой (как упомянуто в комментарии).

2 / В отличие от 1, вам нужна одна карта / Unmap и одно рисование (вы можете также указать количество вершин в DeviceContext-> Draw, чтобы убедиться, что вы рисуете только соответствующую часть вашего буфера). Это будет вашим лучшим выбором по производительности, и не должно быть слишком сложно определить какую-либо форму максимально определенного (даже 1 млн. Поли — это не так много памяти, и у вас будет довольно трудное время, чтобы ваш процессор загружал такое количество). данных каждый кадр).

3 / Я не вижу никакой пользы в вашем случае использования (воссоздание ресурсов является обычным делом, когда вы выполняете асинхронную загрузку для некоторых неизменяемых ресурсов, поэтому здесь это не совсем применимо).

Итак, перейдите к 2, если однажды память станет проблемой, довольно легко вернуться к 1, но я сомневаюсь, что это когда-нибудь случится.

0

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


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector