1 added
1 removed
Original
2026-01-01
Modified
2026-03-07
1
<p>Блог xyz school</p>
1
<p>Блог xyz school</p>
2
<h2>Оптимизация: почему время важнее полигонов</h2>
2
<h2>Оптимизация: почему время важнее полигонов</h2>
3
<p>Многие начинающие 3D-художники и разработчики игр знают, что существует "оптимизация" - нечто, что позволяет повысить частоту кадров. Но зачастую они не разбираются в том, как она работает - и это заставляет их принимать неверные решения.</p>
3
<p>Многие начинающие 3D-художники и разработчики игр знают, что существует "оптимизация" - нечто, что позволяет повысить частоту кадров. Но зачастую они не разбираются в том, как она работает - и это заставляет их принимать неверные решения.</p>
4
<p>В этом материале преподаватель курса<a>OutBlock</a>и левел-дизайнер VOID Interactive Денис Куандыков объясняет, как устроена оптимизация, и почему количество полигонов тут - не ключевой фактор.</p>
4
<p>В этом материале преподаватель курса<a>OutBlock</a>и левел-дизайнер VOID Interactive Денис Куандыков объясняет, как устроена оптимизация, и почему количество полигонов тут - не ключевой фактор.</p>
5
<p><strong>В чём проблема</strong>Работая с геометрией, новичок может потратить уйму времени впустую, пытаясь сократить количество полигонов. Даже если лимит по техническому заданию позволяет определённому<strong>LOD</strong>(<em>уровню детализации</em>) держать в себе 10-15 тысяч трисов (<em>полигонов с тремя сторонами</em>), моделер может решить, что если он всё уместит в 5 тысяч треугольников, то работа станет более "оптимизированной". Это не так.</p>
5
<p><strong>В чём проблема</strong>Работая с геометрией, новичок может потратить уйму времени впустую, пытаясь сократить количество полигонов. Даже если лимит по техническому заданию позволяет определённому<strong>LOD</strong>(<em>уровню детализации</em>) держать в себе 10-15 тысяч трисов (<em>полигонов с тремя сторонами</em>), моделер может решить, что если он всё уместит в 5 тысяч треугольников, то работа станет более "оптимизированной". Это не так.</p>
6
<p><em>Оценить абстрактную "стоимость" рендера одного кадра невозможно - нужно знать, под какие устройства создаётся игра, и что именно в ней отрисовывается.</em><em></em></p>
6
<p><em>Оценить абстрактную "стоимость" рендера одного кадра невозможно - нужно знать, под какие устройства создаётся игра, и что именно в ней отрисовывается.</em><em></em></p>
7
<p>Если 3D-артист со стороны попытается самостоятельно оценить сложность кадра, то может получиться недоразумение. Художник не знает, какое количество треугольников будет оптимальным, если нет чёткого технического задания.</p>
7
<p>Если 3D-артист со стороны попытается самостоятельно оценить сложность кадра, то может получиться недоразумение. Художник не знает, какое количество треугольников будет оптимальным, если нет чёткого технического задания.</p>
8
<p>Если оно есть, это решает проблему. Но иногда техническое задание бывает нечётким не по вине заказчика: например, если вы сами разрабатываете собственную игру, или же если в проекте всё стандартно и нет ничего специфичного.</p>
8
<p>Если оно есть, это решает проблему. Но иногда техническое задание бывает нечётким не по вине заказчика: например, если вы сами разрабатываете собственную игру, или же если в проекте всё стандартно и нет ничего специфичного.</p>
9
<p><strong>Как устроена отрисовка кадра</strong>Процесс отрисовки кадра - это та самая "магия под капотом движка". У отрисовки, как и у работы художника, есть стоимость, и рассчитывается она исходя из необходимого времени.</p>
9
<p><strong>Как устроена отрисовка кадра</strong>Процесс отрисовки кадра - это та самая "магия под капотом движка". У отрисовки, как и у работы художника, есть стоимость, и рассчитывается она исходя из необходимого времени.</p>
10
<p>Для того, чтобы оценить время рендера, в редакторах и движках есть отдельные инструменты. Одного лишь значения кадров в секунду в любом случае недостаточно.</p>
10
<p>Для того, чтобы оценить время рендера, в редакторах и движках есть отдельные инструменты. Одного лишь значения кадров в секунду в любом случае недостаточно.</p>
11
<p>Во всех движках есть вывод статистики. Самое важное в нашем случае - это значение времени одного кадра.</p>
11
<p>Во всех движках есть вывод статистики. Самое важное в нашем случае - это значение времени одного кадра.</p>
12
<p>"Время кадра" - это время в милисекундах, за которое может быть построен и отрисован один кадр. Чтобы получить 60 кадров в секунду, один кадр должен быть обсчитан за 16 милисекунд или еще быстрее.</p>
12
<p>"Время кадра" - это время в милисекундах, за которое может быть построен и отрисован один кадр. Чтобы получить 60 кадров в секунду, один кадр должен быть обсчитан за 16 милисекунд или еще быстрее.</p>
13
<p><strong>Draw Call</strong>(<strong>вызов отрисовки</strong>) - это одна графическая команда, которая должна что то отрисовать.</p>
13
<p><strong>Draw Call</strong>(<strong>вызов отрисовки</strong>) - это одна графическая команда, которая должна что то отрисовать.</p>
14
<p>Сложность кадра можно оценивать именно с помощью вызовов отрисовки. Чем их больше, тем дольше они обсчитываются, тем медленнее выполняется 1 кадр, тем меньше кадров в одной секунде и тем меньше итоговый FPS.</p>
14
<p>Сложность кадра можно оценивать именно с помощью вызовов отрисовки. Чем их больше, тем дольше они обсчитываются, тем медленнее выполняется 1 кадр, тем меньше кадров в одной секунде и тем меньше итоговый FPS.</p>
15
<p>И наоборот - чем меньше вызовов отрисовки, тем быстрее считается кадр, и тем выше FPS.</p>
15
<p>И наоборот - чем меньше вызовов отрисовки, тем быстрее считается кадр, и тем выше FPS.</p>
16
<p>Frame Debugger - встроенная утилита Unity, позволяющая прямо в редакторе разобрать один кадр на все составляющие. Этот кадр занял 96 отрисовок.</p>
16
<p>Frame Debugger - встроенная утилита Unity, позволяющая прямо в редакторе разобрать один кадр на все составляющие. Этот кадр занял 96 отрисовок.</p>
17
<p>Примерный разброс лимитов на Draw Call можно описать так:</p>
17
<p>Примерный разброс лимитов на Draw Call можно описать так:</p>
18
<p>- Мобильные игры - примерно 100 на средне-высоких настройках, на топовых устройствах можно и больше.</p>
18
<p>- Мобильные игры - примерно 100 на средне-высоких настройках, на топовых устройствах можно и больше.</p>
19
<p>- Игры для ПК и консолей - до 4000.</p>
19
<p>- Игры для ПК и консолей - до 4000.</p>
20
<p>Например, Battelfield и третий "Ведьмак" в среднем работают на 1000-2000 вызовах отрисовки.<em></em></p>
20
<p>Например, Battelfield и третий "Ведьмак" в среднем работают на 1000-2000 вызовах отрисовки.<em></em></p>
21
<p>А у PUBG этот показатель скачет от адекватных цифр (до 5 тысяч) вплоть до безумных 50 тысяч Draw Call. Такой разброс - это плохо.<em></em></p>
21
<p>А у PUBG этот показатель скачет от адекватных цифр (до 5 тысяч) вплоть до безумных 50 тысяч Draw Call. Такой разброс - это плохо.<em></em></p>
22
<p>В то же время, некоторые внутренние движки Ubisoft спокойно работают на значениях вплоть до 20 тысяч. Дело в том, что Draw Call - это тоже не идеальное мерило производительности. Вызовы отрисовки бывают разные, и тут всё зависит от того как работает конкретный рендер-пайплайн в конкретном проекте. Подробно разобраться в том, как это устроено, можно<a>здесь</a>.</p>
22
<p>В то же время, некоторые внутренние движки Ubisoft спокойно работают на значениях вплоть до 20 тысяч. Дело в том, что Draw Call - это тоже не идеальное мерило производительности. Вызовы отрисовки бывают разные, и тут всё зависит от того как работает конкретный рендер-пайплайн в конкретном проекте. Подробно разобраться в том, как это устроено, можно<a>здесь</a>.</p>
23
<p>Рендер-пайплайн - это очень сложная система, и во многих крупных проектах она уникальна. Из-за этого оценить оптимизацию порой практически невозможно.<em></em></p>
23
<p>Рендер-пайплайн - это очень сложная система, и во многих крупных проектах она уникальна. Из-за этого оценить оптимизацию порой практически невозможно.<em></em></p>
24
<p>Однако вы можете самостоятельно проанализировать отрисовку кадра любой ПК игры, используя специальные инструменты:</p>
24
<p>Однако вы можете самостоятельно проанализировать отрисовку кадра любой ПК игры, используя специальные инструменты:</p>
25
<p>- RenderDoc</p>
25
<p>- RenderDoc</p>
26
<p>- Nvidia Nsight</p>
26
<p>- Nvidia Nsight</p>
27
<p>- Intel Graphics Perfomance Analisys<em></em></p>
27
<p>- Intel Graphics Perfomance Analisys<em></em></p>
28
<p>Подробнее обо всех этих инструментах можно узнать<a>здесь</a>.</p>
28
<p>Подробнее обо всех этих инструментах можно узнать<a>здесь</a>.</p>
29
<p>Самое важное: нужно оценивать стоимость кадра. А первичное мерило стоимости - это время. Уже затем можно всё раскладывать на процессы, то есть, на те самые вызовы отрисовки.</p>
29
<p>Самое важное: нужно оценивать стоимость кадра. А первичное мерило стоимости - это время. Уже затем можно всё раскладывать на процессы, то есть, на те самые вызовы отрисовки.</p>
30
<p>Когда обсуждают оптимизацию проекта и специфику его контента, в первую очередь речь заходит не о количестве полигонов, а о том, сколько примерно можно позволить себе вызовов отрисовки, - учитывая железо и технологии.</p>
30
<p>Когда обсуждают оптимизацию проекта и специфику его контента, в первую очередь речь заходит не о количестве полигонов, а о том, сколько примерно можно позволить себе вызовов отрисовки, - учитывая железо и технологии.</p>
31
<p><strong>Вызовы отрисовки</strong>Теперь разберёмся, как именно можно подсчитать количество этих вызовов.</p>
31
<p><strong>Вызовы отрисовки</strong>Теперь разберёмся, как именно можно подсчитать количество этих вызовов.</p>
32
-
<p>Простой пример: у нас есть 10 ящиков и одно дерево. Все десять ящик��в имеют один и тот же шейдер, материал и количество полигонов. Логично предположить, что у нас будет 11 вызовов, ведь в кадре 11 объектов.</p>
32
+
<p>Простой пример: у нас есть 10 ящиков и одно дерево. Все десять ящиков имеют один и тот же шейдер, материал и количество полигонов. Логично предположить, что у нас будет 11 вызовов, ведь в кадре 11 объектов.</p>
33
<p>Всё почти так и есть. Программа рендерит так: "ящик, ящик, ящик, ящик, ящик... и потом дерево. Кадр построен".</p>
33
<p>Всё почти так и есть. Программа рендерит так: "ящик, ящик, ящик, ящик, ящик... и потом дерево. Кадр построен".</p>
34
<p>Однако, судя по статистике, у нас всего три<strong>батча</strong>(вызова отрисовки):<em></em></p>
34
<p>Однако, судя по статистике, у нас всего три<strong>батча</strong>(вызова отрисовки):<em></em></p>
35
<p>Дело в том, что движок сам понимает, что перед ним десять одинаковых ящиков. Он сам "сшивает" ящики в один объект, и теперь процессор отдает нашей видеопамяти на отрисовку один кусок меша, который мы видим как 10 отдельных ящиков.</p>
35
<p>Дело в том, что движок сам понимает, что перед ним десять одинаковых ящиков. Он сам "сшивает" ящики в один объект, и теперь процессор отдает нашей видеопамяти на отрисовку один кусок меша, который мы видим как 10 отдельных ящиков.</p>
36
<p>Этот процесс называется "<strong>батчинг</strong>". Он бывает динамическим и статическим.</p>
36
<p>Этот процесс называется "<strong>батчинг</strong>". Он бывает динамическим и статическим.</p>
37
<p><strong>Как устроен батчинг</strong>Динамический батчинг работает, если он включен в движке. Движок сам анализирует геометрию и сшивает те объекты, которые подходят под лимиты.</p>
37
<p><strong>Как устроен батчинг</strong>Динамический батчинг работает, если он включен в движке. Движок сам анализирует геометрию и сшивает те объекты, которые подходят под лимиты.</p>
38
<p>Обычно у динамического батчинга очень жёсткие лимиты; он не позволяет сшивать тяжёлую геометрию и занимается в основном мелкими деталями в кадре. Например, если от стены динамически отделились мелкие осколки, то они они, скорее всего, будут сшиты динамическим батчингом в каждом отдельном кадре.</p>
38
<p>Обычно у динамического батчинга очень жёсткие лимиты; он не позволяет сшивать тяжёлую геометрию и занимается в основном мелкими деталями в кадре. Например, если от стены динамически отделились мелкие осколки, то они они, скорее всего, будут сшиты динамическим батчингом в каждом отдельном кадре.</p>
39
<p><strong>Как устроен батчинг</strong><strong>Динамический</strong>батчинг работает, если он включен в движке. Движок сам анализирует геометрию и сшивает те объекты, которые подходят под лимиты.</p>
39
<p><strong>Как устроен батчинг</strong><strong>Динамический</strong>батчинг работает, если он включен в движке. Движок сам анализирует геометрию и сшивает те объекты, которые подходят под лимиты.</p>
40
<p>Обычно у динамического батчинга очень жёсткие лимиты; он не позволяет сшивать тяжёлую геометрию и занимается в основном мелкими деталями в кадре. Например, если от стены динамически отделились мелкие осколки, то они они, скорее всего, будут сшиты динамическим батчингом в каждом отдельном кадре.</p>
40
<p>Обычно у динамического батчинга очень жёсткие лимиты; он не позволяет сшивать тяжёлую геометрию и занимается в основном мелкими деталями в кадре. Например, если от стены динамически отделились мелкие осколки, то они они, скорее всего, будут сшиты динамическим батчингом в каждом отдельном кадре.</p>
41
<p><strong>Партикли</strong>(система частиц) умеют "сшиваться" сами по себе, поэтому их стоит использовать, если нужно нарисовать много одинаковых мелких объектов.</p>
41
<p><strong>Партикли</strong>(система частиц) умеют "сшиваться" сами по себе, поэтому их стоит использовать, если нужно нарисовать много одинаковых мелких объектов.</p>
42
<p>Например, тысячи рыб в кадре в Abzu - это на самом деле партикли, геометрия которых дополнительно анимирована шейдером с вертексной анимацией.</p>
42
<p>Например, тысячи рыб в кадре в Abzu - это на самом деле партикли, геометрия которых дополнительно анимирована шейдером с вертексной анимацией.</p>
43
<p><strong>Статический</strong>же батчинг происходит "заранее". Для этого нужно указать что этот объект статичен, и никогда не будет изменен или сдвинут.</p>
43
<p><strong>Статический</strong>же батчинг происходит "заранее". Для этого нужно указать что этот объект статичен, и никогда не будет изменен или сдвинут.</p>
44
<p>Отличие от динамического батчинга в том, что он позволяет перерабатывать огромное количество объектов. За один батч Unity может сшить объектов общим количеством до 64 000 треугольников.</p>
44
<p>Отличие от динамического батчинга в том, что он позволяет перерабатывать огромное количество объектов. За один батч Unity может сшить объектов общим количеством до 64 000 треугольников.</p>
45
<p>Кроме того, динамический батчинг будет пытаться пересобрать геометрию почти в каждом новом кадре, - а значит будет постоянно увеличивать время расчёта.</p>
45
<p>Кроме того, динамический батчинг будет пытаться пересобрать геометрию почти в каждом новом кадре, - а значит будет постоянно увеличивать время расчёта.</p>
46
<p><em>Именно батчинг виноват в том, что в огромном количестве игр до сих пор нельзя разрушить любую стену или сдвинуть стул с места.</em></p>
46
<p><em>Именно батчинг виноват в том, что в огромном количестве игр до сих пор нельзя разрушить любую стену или сдвинуть стул с места.</em></p>
47
<p>Чтобы батчинг сработал, объекты должны быть "одинаковы". Объекты должны иметь один и тот же шейдер, материал на этом шейдере (в Unreal это инстанс материала), текстуру и остальные параметры объекта, а также не должны иметь Non Uniform Scale и не должны быть разбиты светом.</p>
47
<p>Чтобы батчинг сработал, объекты должны быть "одинаковы". Объекты должны иметь один и тот же шейдер, материал на этом шейдере (в Unreal это инстанс материала), текстуру и остальные параметры объекта, а также не должны иметь Non Uniform Scale и не должны быть разбиты светом.</p>
48
<p>Одна из причин того, почему от художников требуют не текстурить объекты уникальными сетами отдельных текстур, а паковать их в огромные текстурные атласы - как раз в этом. Это позволяет отдать батчингу на обработку сотни разных визуально разных объектов, - ведь они будут отрисованы не отдельно, а группами.</p>
48
<p>Одна из причин того, почему от художников требуют не текстурить объекты уникальными сетами отдельных текстур, а паковать их в огромные текстурные атласы - как раз в этом. Это позволяет отдать батчингу на обработку сотни разных визуально разных объектов, - ведь они будут отрисованы не отдельно, а группами.</p>
49
<p>Пример очень простого атласа для тайловых поверхностей.</p>
49
<p>Пример очень простого атласа для тайловых поверхностей.</p>
50
<p>Как уже было сказано, важнейшее мерило оптимизации - время. Иногда один раз загрузить в память один огромный текстурный атлас гораздо выгоднее, чем постоянно гонять туда-сюда отдельные мелкие текстуры - даже если в сумме они будут занимать в памяти меньше места, чем атлас целиком. Загрузка и выгрузка - не бесплатный процесс.</p>
50
<p>Как уже было сказано, важнейшее мерило оптимизации - время. Иногда один раз загрузить в память один огромный текстурный атлас гораздо выгоднее, чем постоянно гонять туда-сюда отдельные мелкие текстуры - даже если в сумме они будут занимать в памяти меньше места, чем атлас целиком. Загрузка и выгрузка - не бесплатный процесс.</p>
51
<p>Однако батчинг тоже не "бесплатен" - даже если он статический и обсчитан заранее. Сцены в играх нужно освещать, и даже в случае статичного освещения это будет влиять на батчинг.</p>
51
<p>Однако батчинг тоже не "бесплатен" - даже если он статический и обсчитан заранее. Сцены в играх нужно освещать, и даже в случае статичного освещения это будет влиять на батчинг.</p>
52
<p>💥 Курс "OutBlock" для тебя, если хочешь создавать игровые уровни, которые рассказывают историю</p>
52
<p>💥 Курс "OutBlock" для тебя, если хочешь создавать игровые уровни, которые рассказывают историю</p>
53
<p>На курсе научишься управлять вниманием и эмоциями игрока, пока он перемещается по пространству. Разберёшься, как строить навигацию, арены и интерьеры. В итоге сможешь проектировать уровни, которые что-то говорят игроку, а не просто для красоты. Курс можно взять в рассрочку.</p>
53
<p>На курсе научишься управлять вниманием и эмоциями игрока, пока он перемещается по пространству. Разберёшься, как строить навигацию, арены и интерьеры. В итоге сможешь проектировать уровни, которые что-то говорят игроку, а не просто для красоты. Курс можно взять в рассрочку.</p>
54
<p>Так например, два одинаковых ящика, которые в обычной ситуации превратились бы в один батч, разделят на два батча, так как они привязаны к разным<strong>лайт-пробам</strong>(Light Probe).</p>
54
<p>Так например, два одинаковых ящика, которые в обычной ситуации превратились бы в один батч, разделят на два батча, так как они привязаны к разным<strong>лайт-пробам</strong>(Light Probe).</p>
55
<p>Освещение в реальном времени тоже будет влиять на то, какие объекты сбатчатся, а какие - нет.</p>
55
<p>Освещение в реальном времени тоже будет влиять на то, какие объекты сбатчатся, а какие - нет.</p>
56
<p>Световые зонды (Light Probes) нужны, чтобы запечь в себя шейдинг в статичном освещении. Они позволяют затенить динамический объект в сцене с Light Map.</p>
56
<p>Световые зонды (Light Probes) нужны, чтобы запечь в себя шейдинг в статичном освещении. Они позволяют затенить динамический объект в сцене с Light Map.</p>
57
<p>Кроме того, нужно учитывать где будет храниться полученный материал. Ведь сбатченная геометрия - это отдельный уникальный меш, который не заменяет ваши ящики на локации. То есть, батчинг требует свободной памяти.</p>
57
<p>Кроме того, нужно учитывать где будет храниться полученный материал. Ведь сбатченная геометрия - это отдельный уникальный меш, который не заменяет ваши ящики на локации. То есть, батчинг требует свободной памяти.</p>
58
<p>Поэтому иногда применяют "ручной" батчинг, он же просто "<strong>мердж</strong>" (merge). Берём геометрию, и в любой программе сшиваем так, как нужно под конкретную сцену.</p>
58
<p>Поэтому иногда применяют "ручной" батчинг, он же просто "<strong>мердж</strong>" (merge). Берём геометрию, и в любой программе сшиваем так, как нужно под конкретную сцену.</p>
59
<p>На финальных итерациях, когда весь левел-дизайн и левел-арт готовы, многие мобильные проекты проходят этап ручного сшивания всей локации. А модульные объекты, из которых состояла локация, и вовсе не идут в билд так как заменяются смерженным мешем.</p>
59
<p>На финальных итерациях, когда весь левел-дизайн и левел-арт готовы, многие мобильные проекты проходят этап ручного сшивания всей локации. А модульные объекты, из которых состояла локация, и вовсе не идут в билд так как заменяются смерженным мешем.</p>
60
<p>Иногда гораздо выгоднее скормить движку огромный меш в 64 тысячи треугольников, чтобы отрисовать всю локацию целиком. Так поступили, например, разработчики Guns Of Boom.</p>
60
<p>Иногда гораздо выгоднее скормить движку огромный меш в 64 тысячи треугольников, чтобы отрисовать всю локацию целиком. Так поступили, например, разработчики Guns Of Boom.</p>
61
<p>Дмитрий Гладилин - Проблемы и решения при создании графики для мобильного шутера Guns of Boom</p>
61
<p>Дмитрий Гладилин - Проблемы и решения при создании графики для мобильного шутера Guns of Boom</p>
62
<p>Подобный подход практически полностью исключает использование Occlusion Culling. Эта техника позволяет не рисовать те объекты, которые не видны камере. То есть, когда ящик перекрыт другим более крупным ящиком - мы его не видим, а значит можем не рисовать. В случае со "склеенными" мешами такое разделение невозможно.</p>
62
<p>Подобный подход практически полностью исключает использование Occlusion Culling. Эта техника позволяет не рисовать те объекты, которые не видны камере. То есть, когда ящик перекрыт другим более крупным ящиком - мы его не видим, а значит можем не рисовать. В случае со "склеенными" мешами такое разделение невозможно.</p>
63
<p><strong>Уровни детализации</strong><strong>Level of Detail</strong>(<strong>LOD, или уровень детализации</strong>) - простая техника, которая позволяет уместить огромное количество объектов в кадре, не отнимая время на обработку лишней геометрии.</p>
63
<p><strong>Уровни детализации</strong><strong>Level of Detail</strong>(<strong>LOD, или уровень детализации</strong>) - простая техника, которая позволяет уместить огромное количество объектов в кадре, не отнимая время на обработку лишней геометрии.</p>
64
<p>LOD может разбить объекты на разные батчи: и в этом нет ничего страшного, ведь зачастую несколько сотен лишних DrawCall будет быстрее обсчитаны на лодированых мешах чем рисовать их оригиналы - но сбатченные.</p>
64
<p>LOD может разбить объекты на разные батчи: и в этом нет ничего страшного, ведь зачастую несколько сотен лишних DrawCall будет быстрее обсчитаны на лодированых мешах чем рисовать их оригиналы - но сбатченные.</p>
65
<p>Сейчас есть неплохие инструменты автоматической генерации LOD-мешей, и это облегчает работу. При нужной настройке можно выдать результат не сильно хуже ручной ретопологии. Но даже используя автоматику, не стоит делать тысячи разных уровней детализации: все уровни LOD тоже нужно хранить в памяти, а её не стоит забивать просто так.</p>
65
<p>Сейчас есть неплохие инструменты автоматической генерации LOD-мешей, и это облегчает работу. При нужной настройке можно выдать результат не сильно хуже ручной ретопологии. Но даже используя автоматику, не стоит делать тысячи разных уровней детализации: все уровни LOD тоже нужно хранить в памяти, а её не стоит забивать просто так.</p>
66
<p>Обычно используют четыре уровня детализации. LOD-0 - это оригинальная модель, а LOD-3 - дальняя. LOD4 может быть просто 2D спрайтом который всегда смотрит на игрока.</p>
66
<p>Обычно используют четыре уровня детализации. LOD-0 - это оригинальная модель, а LOD-3 - дальняя. LOD4 может быть просто 2D спрайтом который всегда смотрит на игрока.</p>
67
<p>Кроме LOD-0 порой нужно делать отдельную модель для кат-сцен. В ней может быть куда больше полигонов, чем у LOD-0, потому что она появляется лишь в срежиссированных сценах, и, как правило, находится очень близко к камере - поэтому для неё лучше использовать крайне высокую детализацию.</p>
67
<p>Кроме LOD-0 порой нужно делать отдельную модель для кат-сцен. В ней может быть куда больше полигонов, чем у LOD-0, потому что она появляется лишь в срежиссированных сценах, и, как правило, находится очень близко к камере - поэтому для неё лучше использовать крайне высокую детализацию.</p>
68
<p>Это касается даже мелких объектов: например, у обычной кружки в одной из стартовых сцен Dead Space 2 было достаточно полигонов, чтобы она не казалась "квадратной", в то время как в остальной игре в LOD-0 у аналогичных объектов не было такого сглаживания.</p>
68
<p>Это касается даже мелких объектов: например, у обычной кружки в одной из стартовых сцен Dead Space 2 было достаточно полигонов, чтобы она не казалась "квадратной", в то время как в остальной игре в LOD-0 у аналогичных объектов не было такого сглаживания.</p>
69
<p>LOD-ы позволяют не считать лишние сотни полигонов в вашей модели. В первую очередь важно понимать роль модели в сцене и прикидывать, насколько детально игрок сможет её разглядеть.</p>
69
<p>LOD-ы позволяют не считать лишние сотни полигонов в вашей модели. В первую очередь важно понимать роль модели в сцене и прикидывать, насколько детально игрок сможет её разглядеть.</p>
70
<p>Если модель, например, можно разглядеть вблизи с максимальным приближением, то просто сделайте LOD-0 достаточно детализированным, - а в самой сцене основным рабочим уровнем будет LOD-1.</p>
70
<p>Если модель, например, можно разглядеть вблизи с максимальным приближением, то просто сделайте LOD-0 достаточно детализированным, - а в самой сцене основным рабочим уровнем будет LOD-1.</p>
71
<p>Подход, основанный на роли модели в кадре полностью защищает вас от критики сторонников "идеальной сетки", которые без понимания контекста - просто по скриншоту, - заявят, что вы сделали 10 лишних треугольников.</p>
71
<p>Подход, основанный на роли модели в кадре полностью защищает вас от критики сторонников "идеальной сетки", которые без понимания контекста - просто по скриншоту, - заявят, что вы сделали 10 лишних треугольников.</p>
72
<p><em>Зачем тратить время и доказывать кому либо в комментариях на ArtStation, что у вас не завышенный полигонаж? Время - куда более важный показатель оптимизации. И ваше время - в том числе.</em><em></em></p>
72
<p><em>Зачем тратить время и доказывать кому либо в комментариях на ArtStation, что у вас не завышенный полигонаж? Время - куда более важный показатель оптимизации. И ваше время - в том числе.</em><em></em></p>
73
<p><strong>Alpha overdraw</strong><strong>Рендер-пайплайн</strong>должен адекватно рассортировать и нарисовать сцену - обработать шейдеры, геометрию, текстуры и пост-процессы. К тому же он должен учитывать, что объекты могут быть прозрачными.</p>
73
<p><strong>Alpha overdraw</strong><strong>Рендер-пайплайн</strong>должен адекватно рассортировать и нарисовать сцену - обработать шейдеры, геометрию, текстуры и пост-процессы. К тому же он должен учитывать, что объекты могут быть прозрачными.</p>
74
<p>Чем больше площадь прозрачности в кадре, и чем больше прозрачные объекты наслаиваются друг на друга - тем дольше рендер-пайплайн будет рисовать итоговый пиксель, ведь ему придётся каждый раз его перерисовывать. Это называется<strong>Alpha overdraw</strong>.</p>
74
<p>Чем больше площадь прозрачности в кадре, и чем больше прозрачные объекты наслаиваются друг на друга - тем дольше рендер-пайплайн будет рисовать итоговый пиксель, ведь ему придётся каждый раз его перерисовывать. Это называется<strong>Alpha overdraw</strong>.</p>
75
<p>Чем меньше альфы, тем быстрее будут обсчитаны пиксели. По сути, шейдер и сам рендер - это процесс/программа, которая рисует конкретный цвет конкретного пикселя на экране. И в этом случае пара десятков лишних треугольников, наоборот, ускорит рендер.</p>
75
<p>Чем меньше альфы, тем быстрее будут обсчитаны пиксели. По сути, шейдер и сам рендер - это процесс/программа, которая рисует конкретный цвет конкретного пикселя на экране. И в этом случае пара десятков лишних треугольников, наоборот, ускорит рендер.</p>
76
<p>Cлева - обычный "плейн" с текстурой ветки. Справа - он же, но силуэт ветки обрезан по контуру, чтобы срезать лишнюю прозрачную площадь.</p>
76
<p>Cлева - обычный "плейн" с текстурой ветки. Справа - он же, но силуэт ветки обрезан по контуру, чтобы срезать лишнюю прозрачную площадь.</p>
77
<p>Z-Fight - артефакт, который образуется, если поставить несколько полигонов в одной плоскости. Рендеру не хватает точности глубины, чтобы отсортировать отрисовку этих полигонов в правильном порядке.</p>
77
<p>Z-Fight - артефакт, который образуется, если поставить несколько полигонов в одной плоскости. Рендеру не хватает точности глубины, чтобы отсортировать отрисовку этих полигонов в правильном порядке.</p>
78
<p>Но кроме визуального артефакта, который заметит игрок, это повлияет и на время рендера - ведь пиксели в этом месте будут постоянно "спорить" друг с другом об очереди отрисовки.</p>
78
<p>Но кроме визуального артефакта, который заметит игрок, это повлияет и на время рендера - ведь пиксели в этом месте будут постоянно "спорить" друг с другом об очереди отрисовки.</p>
79
<p>Два плейна на одной оси. Смешение цветов по центру и есть Z-Fight.</p>
79
<p>Два плейна на одной оси. Смешение цветов по центру и есть Z-Fight.</p>
80
<p><strong>Итог</strong>Итак, мы выяснили, что практически ничего "бесплатного" в случае с отрисовкой кадра не бывает: технологии, которые позволяют что-то оптимизировать, не работают по нажатию нужной галочки. Всегда нужно понимать, для чего мы используем тот или иной инструмент.</p>
80
<p><strong>Итог</strong>Итак, мы выяснили, что практически ничего "бесплатного" в случае с отрисовкой кадра не бывает: технологии, которые позволяют что-то оптимизировать, не работают по нажатию нужной галочки. Всегда нужно понимать, для чего мы используем тот или иной инструмент.</p>
81
<p>Нынешнее железо - даже мобильное, - может обрабатывать огромное количество треугольников. Объёмы памяти и скорость растут. Чипы на мобильных устройствах и их батареи, которые перегреваются при высоком FPS, тоже становятся всё совершеннее.</p>
81
<p>Нынешнее железо - даже мобильное, - может обрабатывать огромное количество треугольников. Объёмы памяти и скорость растут. Чипы на мобильных устройствах и их батареи, которые перегреваются при высоком FPS, тоже становятся всё совершеннее.</p>
82
<p>Взять и назвать точные диапазоны количества полигонов попросту невозможно - да и бессмысленно. Всё слишком сильно зависит от того для чего используется модель, и как ей видит игрок.</p>
82
<p>Взять и назвать точные диапазоны количества полигонов попросту невозможно - да и бессмысленно. Всё слишком сильно зависит от того для чего используется модель, и как ей видит игрок.</p>
83
<p><strong></strong>Дальше уже можно углубляться в процесс оптимизации в движке и расчёт лимитов под среднестатистическое железо - но если не осознавать, каким образом игрок видит сцену в вашей игре, то все эти расчёты - лишь потеря времени.</p>
83
<p><strong></strong>Дальше уже можно углубляться в процесс оптимизации в движке и расчёт лимитов под среднестатистическое железо - но если не осознавать, каким образом игрок видит сцену в вашей игре, то все эти расчёты - лишь потеря времени.</p>
84
<p><strong></strong><em>Время - крайне важный ресурс не только для рендера, но и для вас как для специалиста.</em><em></em></p>
84
<p><strong></strong><em>Время - крайне важный ресурс не только для рендера, но и для вас как для специалиста.</em><em></em></p>
85
<p>Если вы пытаетесь сэкономить лишнюю тысячу полигонов, потратив на это несколько лишних часов, а на частоту кадров эта экономия никак не повлияет, то вы просто попусту потратили рабочие часы студии или своё личное время. Особенно обидно, если вы фрилансер, - ведь вместо двух моделей за пять часов вы сделали всего лишь одну.</p>
85
<p>Если вы пытаетесь сэкономить лишнюю тысячу полигонов, потратив на это несколько лишних часов, а на частоту кадров эта экономия никак не повлияет, то вы просто попусту потратили рабочие часы студии или своё личное время. Особенно обидно, если вы фрилансер, - ведь вместо двух моделей за пять часов вы сделали всего лишь одну.</p>
86
<p>Чтобы рассчитать число полигонов в первую очередь нужно осознать контекст, в котором используется модель, и лимиты по времени.</p>
86
<p>Чтобы рассчитать число полигонов в первую очередь нужно осознать контекст, в котором используется модель, и лимиты по времени.</p>
87
<p>Ваша задача - сделать классную модель, классный арт, классную игру; а не заниматься "преждевременной оптимизацией".<em></em></p>
87
<p>Ваша задача - сделать классную модель, классный арт, классную игру; а не заниматься "преждевременной оптимизацией".<em></em></p>
88
<p>Денис Куандыков - один из авторов курса по левел-дизайну<a>OutBlock</a>.</p>
88
<p>Денис Куандыков - один из авторов курса по левел-дизайну<a>OutBlock</a>.</p>
89
<p>Среди других авторов - Михаил Кадиков (Crytek), Макс Пирс (CD Projekt Red), Елена Альт (Ice Pick Lougde) и мапмейкер сообщества CS:GO Сергей Морозов.</p>
89
<p>Среди других авторов - Михаил Кадиков (Crytek), Макс Пирс (CD Projekt Red), Елена Альт (Ice Pick Lougde) и мапмейкер сообщества CS:GO Сергей Морозов.</p>
90
<p>Узнать дополнительную информацию и записаться на курс можно<a>здесь</a>.</p>
90
<p>Узнать дополнительную информацию и записаться на курс можно<a>здесь</a>.</p>
91
<p>Хочешь получать лучшие статьиот XyZ раз в неделю?</p>
91
<p>Хочешь получать лучшие статьиот XyZ раз в неделю?</p>
92
<p>Подпишись на рассылку XyZ</p>
92
<p>Подпишись на рассылку XyZ</p>
93
<p>Нажимая на кнопку, вы соглашаетесь с условиями обработки данных</p>
93
<p>Нажимая на кнопку, вы соглашаетесь с условиями обработки данных</p>
94
<p>Курс для тех, кто хочет прокачаться в прототипировании и создании игровых уровней. Уроки помогут разобраться в теме с нуля и начать путь к карьере специалиста по дизайну уровней.</p>
94
<p>Курс для тех, кто хочет прокачаться в прототипировании и создании игровых уровней. Уроки помогут разобраться в теме с нуля и начать путь к карьере специалиста по дизайну уровней.</p>
95
<p>Работа студента Дениса Савенкова</p>
95
<p>Работа студента Дениса Савенкова</p>
96
96