2017-01-25 3 views
1

Я работаю над небольшой картой игры, так как изучаю DirectX11. Что может быть лучшим способом иметь класс BufferManager (возможно, статический) для обработки всех данных вершин и индексов моделей, созданных как в реальном времени, так и раньше. Класс должен отвечать за создание динамических или статических буферов в зависимости от информации о модели, а затем их рисования.Directx11 Как управлять несколькими буферами вершин/индексов?

  • Должен ли я иметь одну вершину и индекс вектора список и добавлять все новые и новые модели к нему ... а затем воссоздать буферы, когда новые данные добавляются и установить новые буферы перед нанесением.
  • Должен ли я иметь отдельные вершинные и индексные буферы для моделей, получить доступ к буму соответствующей модели и установить IASetVertexBuffer(model[i].getVertBuff()) перед каждым вызовом розыгрыша;
  • Также некоторые модели могут быть динамическими, а другие - статическими, как я могу выполнить дозирование здесь?

ответ

1

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

  • Создайте файл загрузчик, текстуры, модели сетки, вершинных данных, нормальный, аудио и т.д.
  • Имейте многократно используемую структуру, которая хранит все эти данные для конкретной сетки модели.
  • При создании этого файла вам также понадобится отдельный класс текстур для хранения информации о разных текстурах. Таким образом, для разных моделей или сеток можно ссылаться на одну и ту же текстуру, и вам не придется каждый раз загружать их в память.
  • То же самое можно сделать и о разных сетках; вы можете ссылаться на сетку, которая может быть частью разных объектов модели.
  • Для этого вам понадобится класс хранения активов, который будет управлять всеми вашими активами. Таким образом, если актив уже находится в памяти, он не будет загружать его снова; такие как шрифт, текстуры, модель, аудио-файл и т.д.
  • Тогда следующая часть вы будете нуждаться в Batch классе и классе Batch Manager,
    • Пакетный класс будет определять контейнер, что пакет основан на нескольких параметрах: примитивные типы, если они имеют прозрачные пленки или нет (очередь приоритетов) и т. д.
    • Класс Batch Manager будет выполнять организацию и отправлять партии на этап рендеринга. Этот класс также будет использоваться для определения количества вершин, которые может содержать партия, и количества пакетов (ведра), которые у вас есть. Отношение будет зависеть от содержания игры. Хорошее соотношение для базового приложения типа 2D-спрайта будет составлять примерно 10 партий, где каждая партия содержит не менее 10 000 вершин. Следующим шагом будет заполнить ведро аналогичных типов на основе примитивного типа и его приоритета (альфа-канал - для глубины Z), и если ведро не сможет хранить данные, оно будет искать другое заполняемое ведро. Если для хранения данных нет ведер, тогда Batch Manager будет искать ведро, которое больше всего заполняется с помощью очереди с наивысшим приоритетом, оно отправит эту партию на видеокарту, которая будет визуализирована, тогда она будет повторно использовать это ведро.
    • Последняя часть будет классом ShaderManager для управления различными типами шейдеров, которые будут использовать ваша программа. Таким образом, все эти классы или структуры будут связаны между собой.

Если дизайн это правильно вы можете абстрактные все двигатели поведения и ответственности вдали от реальной игры содержания, свойств и логики или набор правил.Таким образом, ваш игровой движок может быть повторно использован для нескольких игр. Таким образом, ваш движок не имеет каких-либо зависимостей от конкретной игры, и когда вы будете готовы к повторному использованию, все, что вам нужно сделать, это создать основной проект, который наследуется либо из этой библиотеки Static, либо Dynamic, и все компоненты Engine будут включены в следующую игру. Такое разделение кода является отличным подходом к универсальному многоразовому коду.

Для отличного представления этого подхода я бы предложил проверить этот сайт www.MarekKnows.com и следовать серии видеоуроков Shader Engine. Хотя этот конкретный веб-сайт фокусируется на Win32 на C++, но использует OpenGL вместо DirectX. Однако общая схема проектирования имеет одинаковую концепцию. Единственное различие заключалось бы в том, чтобы разделить части OpenGL и заменить их на DirectX API.

EDIT - Дополнительные ссылки:

Я также нашел, что это написать на Batch Rendering процесс, который Марека Кржеминский, который из его видео-уроки, но найти здесь Batch Rendering by Marek at Gamedev

+1

Wow !!! я уверен, знаю, как сделать двигатель, я понял несколько (извините, что я новичок во всем этом). Спасибо за ссылку и не торопитесь ответить такими подробностями. Я пройду свой ответ несколько раз, чтобы понять это XD. – Tesla

+0

@Tesla Я изучаю его уже довольно давно, и это только верхушка айсберга. –

+0

@Tesla Я также обновил свой ответ в разделе редактирования с еще несколькими ссылками. –