ShadowGun: Optimizing for Mobile Sample Level
ShadowGun: оптимизация уровня под мобильные устройства
by Will Goldstone
Здесь, на Unity, мы хотим поделиться с Вами опытом создания фантастической игры. Одной из важнейших частей нашей работы является то, что Unity является высоко производительной платформой для запуска на мобильных устройствах, но когда дело дойдет до получения лучшей производительности вашей игры - это будет то место, где вы сядите. Поэтому чтобы вам не сгнить в этой тьме, когда дело дойдет до оптимизации вашей игры, мы вместе с MadFinger Games, разработчиками блокбастера 'ShadowGun', решили предложить вам образец уровня их проекта, созданный с применением инновационных методов, чтобы помочь вам узнать о техниках, которые они использовали при создании своей игры.
Образец уровня проекта можно загрузить по ссылке ниже. Это не пример геймплея, он чисто разработан, чтобы помочь вам научиться оптимизировать под мобильные устройства.
Демо уровень
Мы хотели бы поблагодарить MadFinger за помощь в этом проекте и за всю представленную ниже информацию. На некоторые термины, указанные здесь, мы приводим ссылки на внешние сайты, разъясняющие запутанные понятия:
Основные особенности
Если вы хотите получить игру от третьего лица с красивой графикой, сложными уровнями, с кучей врагов и достойным ИИ, который работает безупречно на iPhone 3Gs, вы должны приложить много усилий в оптимизации. В части графики, вы можете оптимизировать число треугольников, количество текстур в памяти и, конечно, шейдеры. Мы обнаружили, что на мобильных устройствах, шейдеры могут быть реальными пожирателями производительности, но и невероятно и мощными помощниками.
Альфа-смешивание убивает (Alpha blending)
Количество фейсов с применением Альфа-смешивания (Alpha blending), особенно, когда они заполняют большую часть экрана, резко снижает производительность мобильных устройств. Когда группы таких фейсов перекрывают друг друга, тогда увеличивается перерисовка (increase overdraw) и это полностью убивает производительность на медленных устройствах.
Сложные, по-пиксельные шейдеры снижают число кадров (Complex, per-pixel shaders)
Мы обнаружили, что рендеринг больших поверхностей (во всю площадь экрана) со сложным фрагментарным шейдером снижает число кадров еще больше, чем Альфа-смешивание. Сложные фрагментарные шейдеры могут быть использованы только для небольших объектов.
Шейдеры в ShadowGun
Спасибо огромное сотрудничеству наших программистов и художников, нам удалось создать шейдеры, которые позволяют создавать сложные эффекты и не требуют высокой производительности. Далее описываются шейдеры, использованные в сборке демонстрационного уровня ShadowGun:
Specular карты окружения (Shader Virtual Gloss Per Vertex Additive)
Этот шейдер сочетает диффузный (RGB) и бликовый (specular) (Альфа) каналы. Specular карта использует Альфа-канал текстуры для определения глянцевых и матовых частей поверхности, как обычно, но блики, рассчитываются не на каждый пиксель, а только на каждую вершину поверхности.
В результате эффекты получаются достаточно убедительными и значительно быстрее вычисляются, по сравнению с попиксельными расчетами. Прекрасно подходят для больших поверхностей (для создания окружения уровня). Этот шейдер позволяет регулировать силу бликовых (specular) эффектов и приблизительно определять направление источника света.
Оптимизированное динамическое освещение и затенение персонажа (Lightprobes и BRDF Shader)
Традиционной проблемой со статическим освещением (картами освещения (Lightmaps)) является не возможность получить соответствующее освещение на динамических объектах (т.е. игровых персонажах и NPC).
Unity предлагает классическое решение, сохранение информации об освещении динамических объектов в прокси-объектах (Light probes). В дальнейшем из которых будет восстановлена информация об освещенности динамических объектов.
Unity также содержит великолепный шейдер для персонажей (superb character shader), который хорошо оптимизирован под мобильные устройства (смотрите нашего Мутанта в демо сцене). Этот шейдер поддерживает Diffuse, Specular and Normal карты и использует специальный скрипт, который генерирует текстуру, использующуюся при оценке освещения в BRDF-функции (in BRDF-like fashion). Персонажи с такими эффектами, приближаются к супер современным персонажам на консолях самых известных брендов.
Туман и объемный свет (Shader Blinking Godrays)
После того как вы включите глобальной туман в 3d-движке, частота кадров опустится ниже играбельного уровня, особенно на старых мобильных устройствах.
Однако, с графической точки зрения, туман значительно улучшает вид окружающей среды, особенно помогает воспринимать глубину и пространство сцены. Мы нашли решение с помощью простой сетки с прозрачной текстурой (Fog planes) вместо глобального тумана. Когда игрок приходит слишком близко к сетке тумана, она исчезает, и более того, вершины сетки тумана расстягиваются на расстонии (pulled away)(даже с полностью прозрачными Альфа каналами поверхности требуют много времени на рендеринг).
Подготовка сетки в 3D приложении для корректной работы с шейдером
Цвет Альфа канала определяет, какие вершины подвижны, а какие нет (в нашем случае, вершины с черными Альфа не двигаются, с белыми Альфа двигаются).
Нормали вершин определяют направление движения.
Затем шейдер оценивает расстояние до зрителя и обрабатывает поверхность соответственно.
Все это просто дублируется и сетка тумана распространяется на уровне где необходимо. Очень похожим образом, мы используем этот шейдер для лучей света, конусов света и других Альфа-эффектов.
Плотный анимированный дым от крушения (Shader Scroll 2 Layers Sine Alpha-blended)
Из-за плотности, частицы дыма довольно дорогие, и мы обнаружили, что лучше использовать простые сетки с анимированными текстурами дыма (например, для фона пожара на месте крушения).
В нашем случае, мы анимируем дым путем смешивания двух текстур и перемещаем их друг относительно друга. Есть также альфа вершин, участвующих в целях сглаживания краев сетки. Сетка также подкрашивается в цвет вершин (The mesh is also colored with vertex colors) (оранжевый, чтобы имитировать огонь на земле, и светло серый, где дым сливается с небом).
Движение облаков (Skybox) (Shadow Scroll 2 Layers Multiplicative)
Для нашего skybox-а, используем аналогичную технику с относительным смещением в шейдере, что создает динамические облака.
Ткани флагов на ветру (Shader Lightmap + Wind)
Любые анимированные объекты в сцене вдыхают жизнь в уровень, и, когда они анимируют себя из шейдера. Мы оживили флаги и кабели в направлении ветра. Информация о том, какие вершины развеваются на ветру, и какие нет, определяется цветом Альфа в 3d-приложении (белый значит движется, черный не движется). В параметрах шейдера, пользователь должен определить направление и скорость развевания.
Юридические уведомления
Все пользовательские шейдеры в демо уровне SHADOWGUN, являются интеллектуальной собственностью MADFINGER Games, и они доступны для свободного пользования (кроме BRDF шейдера, который был создан Unity Technologies, но его также можно использовать бесплатно).
Сетки и текстуры в уровне остается собственностью MADFINGER Games, и не могут использоваться для каких-либо коммерческих целей без разрешения MADFINGER Games.
--------------------------------------------------------------------------------
Это мой первый перевод. Переводил с помощью Яндекс переводчика и своих скромных знаний английского.
То, что выделил курсивом разобрать не смог. Надеюсь на помощь сообщества!
Видео смотрите в оригинальной статье, сюда вставить не получается...