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

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

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

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

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

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

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

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


person kosyumote    schedule 12.06.2014    source источник
comment
Какие вершинные данные вы отправляете? № 2, как правило, был бы хорошим выбором, но я удивлен, что вас беспокоит его размер. Даже самые детализированные объекты обычно имеют менее 100 000 вершин, и даже при большом размере вершин в 8 float4 вы все равно говорите только о 13-мегабайтном буфере.   -  person MooseBoys    schedule 13.06.2014


Ответы (1)


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

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

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

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

person mrvux    schedule 13.06.2014
comment
Спасибо. В том же духе, вероятно, было бы лучше объединить кучу буферов вершин на стороне процессора, а затем вызвать один Map/Unmap и Draw (по сравнению с Map/Unmapping для каждого объекта)? - person kosyumote; 14.06.2014