Gamedev LectureСтатьи

Лекция #7 - Грамотное использование ресурсов GPU. Часть первая: Геометрия. [Лектор - Cote-Duke]

Автор:

<Cote-Duke> Кхмм :)
<Cote-Duke> Я довольно много времени провёл работая над этой темой.
<Cote-Duke> 2-3 месяца я потратил на разработку технологии ренедра бОльшого кол-ва. деревьев и травы.
<Cote-Duke> Конечно полного просветления не достиг, но опыт кое-какой есть.
<Cote-Duke> Сразу могу сказать. "Тупые" методы отрисовки, например, Object = DIP -
<Cote-Duke> Не катят.
<Cote-Duke> Поэтому пришлось серьезно задуматься.
<Cote-Duke> Так, меня просили уточнить API. Могу сказать что техники подходят, в основном, и для OpenGL и для Direct3D.
<Cote-Duke> В среднем, в серьезной игровой сцене, используется не более 500-600 DIP'ов.
<Cote-Duke> (1000 тоже нормально, но уже близко к экстриму, примерно столько можно видеть в Age Of Empires 3)
<Cote-Duke> Напомню: DIP - DrawIndexedPrimitive (любимый вызов в Direct3D %) это всего лишь обращение к видеоплате с запросом отрисовать такой-то вершинный буфер с таким-то индексным буфером. И конечно-же имеет аналог в OpenGL.
<Cote-Duke> Слишком много DIP'ов - и вас не спасёт никакая видео-плата, весь удар идёт прямо на CPU.
<Cote-Duke> 25k DIP'ов и 1 Ghz'овый CPU _полностью_ (100%) загружен.
<Cote-Duke> А что-же делать если нам надо отрисовать 13к деревьев (билбордов) и ещё 5к травы?
<Cote-Duke> Ведь, и в правду, не можем же мы потратить 17к DIP'ов.
<Cote-Duke> Так, хочу заметить, что в OpenGL цена за DIP много меньше чем в Direct3D. Но и это не решает проблем.
<Cote-Duke> Сейчас, я приведу граф сравнения OpenGL и Direct3D по DIP'ам.
<Cote-Duke> http://www.angelfire.com/planet/cdti/graph.JPG
<Cote-Duke> На этом графе вы можете заметить что разница 'DIP cost' между OpenGL и Direct3D уменьшается по мере возрастания кол-ва. DIP'ов.
<Cote-Duke> Так что, одной фразой - "всё, я перехожу на OpenGL" проблем не избежать.
<Cote-Duke> :)
<Cote-Duke> Вернёмся к теме.
<Cote-Duke> И так мы сказали, что с любым API, мы прижаты к рамкам 500-600 DIP'ов в кадр.
<Cote-Duke> Решить проблему которую я описал чуть выше, можно разными подходами.
<Cote-Duke> 1) Использование динамических вершинных буферов
<Cote-Duke> Метод довольно прост.
<Cote-Duke> Мы создаём динамический буфер (для быстрой записи с CPU)
<Cote-Duke> И каждый кадр заполняем его вершинами которые пойдут на отрисовку.
<Cote-Duke> Метод легко реализовать, он не требует особой поддержки со стороны видео-платы.
<Cote-Duke> Но у него есть много минусов.
<Cote-Duke> а) Не очень быстрый (вызов и заполнение буфера, хоть и динамического)
<Cote-Duke> б) Если нужна анимация, то все вершины придётся трансформировать на CPU
<Cote-Duke> Вот конец первой части, часть вторая сразу после вопросов :) Во второй части я поясню как сделать всё намного быстрее и удобнее. С помощью шейдеров.
<Cote-Duke> Вопросы...
<Demiurg-HG> Вопрос: почему только один метод?
<Cote-Duke> Потому-что это один метод который можно релизовать без шейдеров.
<_NexiliaN_> Cote не совсем так их 2
<Zeux> Cote-Duke давай +m и дальше погнали :) конструктивных вопросов нет, наверное. Можно поговорить о всяких трюках типа 4-х буферов, разных режимах лока, но зачем, если сейчас будет мега-метод? :)
<Cote-Duke> Ага :)
<Cote-Duke> Ок.
<Cote-Duke> И так, перейдём к мега-методу.
<Cote-Duke> На самом деле мега-методов два.
<Cote-Duke> Хотя в корне один: Geometry Instancing
<Cote-Duke> Начнём с самого, самого.
<Cote-Duke> Hardware Geometry Instancing
<Cote-Duke> Вообще-то, о нём особо говорить то и нечего.
<Cote-Duke> Самое страшное в нём: требует вершинные шейдеры 3.0.
<Cote-Duke> (Есть только на GeForce 6200, 6600, 6800, 7800, ATI x1000, x1600, x1800)

<Zeux> хотелось бы прервать оратора на секунду
<Zeux> и сказать, что на самом деле хардварный инстансинг есть на всех ATi картах
<Cote-Duke> Ок.
<Zeux> которые держат SM 2.0
<Zeux> он врубается отдельным хаком - POINTSIZE устанавливается в 'INST' (примерно так)
<Zeux> после этого начинают работать все instancing-related функции
<Cote-Duke> Хмм. О таком хаке не слыхал. :)
<Zeux> сейчас будет ссылка
<Zeux> http://circlesoft.org/pages.php?pg=kbasepage&id=32
<Zeux> таким образом, счастливые владельцы Radeon 9500 и выше могут пользоваться :)

<Cote-Duke> Ок, хорошая новость.
<Cote-Duke> Хотя по цене шаг от 9500 до 6200, не большой :)
<Cote-Duke> Вот.
<Cote-Duke> Самое приятное в нём (Hardware Geometry Instancing): Быстро и очень удобно
<Cote-Duke> То есть, довольно легко, мы можем отрисовать сколько угодно одинаковых объектов с разным цветом, трансформацией, всего одним DIP'ом.
<Cote-Duke> Принцип работы основывается на выводе объектов двумя потоками вершинных буферов.
<Cote-Duke> Поток 1 - сам объект, только один (1) раз.
<Cote-Duke> Поток 2 - содержит n- ячеек, в каждой из которых хранится информация о позиции,  размере, цвете, вращение объекта
<Cote-Duke> Эти два потока посылаются на конвейер с помощью  Instancing API.
<Cote-Duke> В конце концов объект выводится n-раз, с помощью одного DIP'а, где n- длина вершинного буфера в потоке номер 2.
<Cote-Duke> Кстати, насколько я знаю, Instancing API есть только в Direct3D.
<Cote-Duke> И пока нет в OpenGL.
<Cote-Duke> Ок время вопросов. (Потом самый мега метод, который работает на sm 1.1)
<Demiurg-HG> Вопрос: по подробнее  про Instancing API?
<Cote-Duke> Ок.
<Cote-Duke> Instancing API, это всего лишь набор функций в Direct3D.
<Cote-Duke> Точнее, в Direct3DDevice'е.
<Demiurg-HG> каких, например?
<Cote-Duke> SetStreamSourceFreq точнее.
<Demiurg-HG> ясно
<Cote-Duke> Я так понял больше вопросов нет?
<_NexiliaN_> давай про константы :)
<Cote-Duke> Ок, буду жечь дальше. про константы :)

Страницы: 1 2 Следующая »

24 января 2006 (Обновление: 9 окт 2010)

Комментарии [4]