Оптимизация вызовов при рисовании в базовом движке XNA - PullRequest
3 голосов
/ 27 апреля 2011



Я хочу оптимизировать свой базовый движок XNA. Структура выглядит примерно так: у меня есть экземпляр GameWorld и к нему прикреплено больше объектов GameObject. Теперь в каждом кадре я делаю цикл между GameObjects и вызываю метод draw внутри них. Недостатком этой реализации является то, что функция рисования GameDevice вызывается несколько раз, по одному для каждого объекта.
Теперь я хочу сократить вызовы рисования, реализуя структуру, которая перед вызовом метода рисования передает всю геометрию в большом векторе, содержит все данные вершин и выполняет один вызов рисования, чтобы нарисовать их все.

Это эффективный способ? Кто-нибудь может подсказать мне решение по оптимизации?

Спасибо

1 Ответ

6 голосов
/ 27 апреля 2011

Первый шаг - уменьшить количество объектов, которые вы рисуете. Есть много способов сделать это, чаще всего:

  1. Отбор Frustum - то есть отбор всех объектов за пределами Frustum вида

  2. Запросы сцены - например, организовать вашу сцену, используя дерево BSP или QuadTree - некоторую структуру данных, которая дает вам возможность уменьшить потенциально видимый набор объектов

  3. Отбор окклюзии - более сложная тема, но в некоторых случаях вы можете определить, что объект не виден, потому что он перекрыт другой геометрией.

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

Если у вас есть потенциально видимый набор объектов, можно отправить их все в GPU по отдельности, но вы должны убедиться, что вы делаете это таким образом, чтобы минимизировать изменения состояния в GPU - например, сгруппируйте все объекты, которые используют одинаковые свойства текстуры / материала, вместе.

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

Просто чтобы прояснить суть - не просто предполагайте, что меньше вызовов при рисовании = быстрее. Конечно, это зависит от многих факторов, в том числе от аппаратного обеспечения, но в целом API XNA / DirectX довольно хорошо справляется с организацией геометрии через конвейер - это то, для чего он все-таки нужен. Ключ не сводит к минимуму вызовы, но сводит к минимуму количество изменений состояния (текстур / шейдеров и т. Д.), Необходимых для всей сцены.

...