HTML Diff
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