XNA, окклюзионная отбраковка и обнаружение столкновений

Я собрал гибридный прототип quadtree/BSP, чтобы проверить обнаружение столкновений и выборку окклюзии в движке для игры XNA, которую я собираю.

Насколько я понимаю, одной из оптимизаций, которые дает нам аппаратное ускорение, является возможность сохранять списки вершин и индексов на карте, так что вызовы для рисования связанной геометрии не должны отправлять данные модели для каждого кадра.

На уровне с большим количеством геометрии, как вам это удается в XNA? Например, если бы я работал в OpenGL, я бы вел список того, что находится на карте, и просто отправлял то, что нужно обновить. Однако высокий уровень абстракции инфраструктуры XNA, по-видимому, настолько инкапсулирует это, что я не могу им управлять.

Скажи мне, почему я не прав, или почему я не должен волноваться.

1 ответ

Решение

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

  • Использовать ли динамический буфер или обычный буфер

"В ситуациях, когда ваша игра часто модифицирует буфер вершин, рекомендуется, чтобы этот экземпляр создавался или производился от DynamicVertexBuffer вместо класса VertexBuffer".

  • Параметр использования при создании буфера

WriteOnly "Указывает, что приложение выполняет запись только в буфер вершин. Если указано, драйвер выбирает наилучшее место в памяти для эффективной записи и рендеринга. Попытки чтения из буфера вершин только для записи завершаются неудачей."

Резюме

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

Примечание. Для XNA 3.1 и ниже с динамическими данными вершин и индексов на xbox было быстрее хранить данные в управляемом массиве и использовать DrawUserPrimitives, чем использовать DynamicVertexBuffer или DynamicIndexBuffer.

Если вы в конечном итоге используете динамический буфер, вы должны быть осторожны, чтобы не остановить конвейер при использовании SetData. См. http://blogs.msdn.com/b/shawnhar/archive/2008/04/15/stalls-part-two-beware-of-setdata.aspx для получения подробной информации.

Другие вопросы по тегам