SlideShare a Scribd company logo
1 of 30
• OPTIMIZATION
BASICS
• BATCHING
• LIGHTING
• SHADERS
WORDS TO
SAY
BASICS BATCHING LIGHTING
SHADERS
«В предыдущей серии»
Рендер, шейдеры, пост-процессинг,
etc.
<DevGamm! Minsk 2014>
• Mobile engine/tools developer в Vizor
Intreractive.
• В прошлом – программист графики
Unity3D в Steel Monkeys.
• 3 года опыта работы с графикой (Adobe
flash, DirectX, OpenGL, Metal)
• Работал с большим количеством open-
source игровых движков
Профилирован
ие
Анализ
результатов
Проектирован
ие
Реализац
ия
Играбельная
версия
Финальный билд
Оптимизация -
циклический процесс
увеличения
производительности
BASICS BATCHING LIGHTING
SHADERS
КОГДА ОПТИМИЗИРОВАТЬ ГРАФИКУ
• «Не сейчас» (с) Сначала получите приемлемый результат.
• Когда производительность приложения на целевых
устройствах Вас не устраивает.
• Вместе с гейм-дизайнером – для решения вопросов об
игровой стилистике.
• Вместе с 2D/3D художником – для быстрой переделки
игровых ресурсов.
BASICS BATCHING LIGHTING
SHADERS
ФОРМАЛИЗАЦИЯ
• Что визуально изменится для игрока?
• Каковы преимущества и недостатки оптимизации?
• Какие игровые ресурсы нужно будет переделывать?
• Какой код нужно переписывать (и кто будет это делать)?
• Сколько времени займет оптимизация?
• Энтропия (Что может не заработать?).
В процессе формализации, Вы отвечаете на вопросы: «Что именно я
делаю?» и «Сколько времени это займет?»
BASICS BATCHING LIGHTING
SHADERS
ПРОФИЛИРОВАНИЕ
• Не считайте попугаев (FPS, draw calls), замеряйте время.
• Не замеряйте производительность в сферическом вакууме.
• Создавайте тесты для быстрого получения результатов.
• Записывайте render time, а не frame time (это исключит из
результата swap buffer delay и vSync).
• Обязательно оценивайте «до/после» только по достижении
планируемого результата.
• Получив массив результатов времени, берите медиану, а не
среднее арифметическое, иначе рискуете получить «среднюю
температуру по больнице».
BASICS BATCHING LIGHTING
SHADERS
ПРОФИЛИРОВАНИЕ UNITY-ПРОФАЙЛЕРОМ
• Время Camera.Render() в профайлере – это именно то, что Вам
нужно.
• Напишите простенький MonoBehaviour:
• OnPreCull() – начало фрейма
• OnPostRender() – конец фрейма
• OnGUI() – для вывода результата
BASICS BATCHING LIGHTING
SHADERS
General-purpose tools
• Unity profiler
• GDebugger (OpenGL
desktop)
• Microsoft PiX (DirectX 9)
• ADB GL tracer (android)
• xCode instruments (iOS)
Platform-specific tools:
• Adreno profiler (Qualcomm
Adreno)
• PerfHUD ES (NVidia Tegra)
• Mali profiler (ARM Mali)
• PVRTune (Imagination tec
PowerVR)
На личном опыте:
• Mali – самая проблемная
• Tegra – самая медленная
• PowerVR – самая
производительная
BASICS BATCHING LIGHTING
SHADERS
БАЗОВЫЙ ПОДХОД:
• Упрощайте шейдеры
• Упрощайте пост-процессинг
• Используйте меньше transparent-объектов
• Подключайте LOD’ы
• Используйте Material ID
• Запекайте цвет и свойства материалов в vertexColor и uv2
• Используйте native-текстуры
• Снижайте Fillrate
• Включайте оптимизацию Mesh’ей
BASICS BATCHING LIGHTING
SHADERS
Static batching:
(+)
• Не нужно постоянно перезаписывать VBO.
• Меньше нагрузка на CPU, так как не нужно
трансформировать вершины в runtime.
• Немного меньше matrix multiplications в runtime.
(-)
• Рендер создает физическую копию забатченной геометрии.
• Нет возможности перемещать статически забатченные
объекты.
• Для работы frustum и occlusion culling’a требуется
динамическая перезапись index buffer.
BASICS BATCHING LIGHTING
SHADERS
model matrix position world position
_Object2World – model matrix
_World2Object – inverse model matrix
UNITY_MATRIX_MVP – model-view-projection matrix
BASICS BATCHING LIGHTING
SHADERS
BASICS BATCHING LIGHTING
SHADERS
BASICS BATCHING LIGHTING
SHADERS
BASICS BATCHING LIGHTING
SHADERS
[0] [1] [2] [3] [4]
BASICS BATCHING LIGHTING
SHADERS
BASICS BATCHING LIGHTING
SHADERS
• Используйте как можно меньше
динамических источников
освещения на сцене
• Уменьшайте количество «per-
pixel lights в Quality Settings.
• Помечайте второстепенные
источники света как «non-
important»
• При огромном количестве
источников освещения –
подключайте Deferred shading
• Не слишком полагайтесь на
Surface шейдеры.
LIGHTING
BASICS BATCHING LIGHTING
SHADERS
• SubShader:
• Forward base
• GLES
• Base
• KEYWORD_A
• KEYWORD_B
...
• Shadow caster
• Shadow collector
• DX9
• WP8
• Playstation 3
…
• Forward add
• Prepass base
• Prepass final
Shader "Custom/NewShader" {
Properties {
_MainTex("Base (RGB)", 2D) = "white" {}
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf Lambert
sampler2D _MainTex;
struct Input {
float2 uv_MainTex;
};
void surf (Input IN, inout SurfaceOutput o) {
half4 c = tex2D(_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}
Варианты Вашего
шейдера:
BASICS BATCHING LIGHTING
SHADERS
• 12K triangles
• 24K vertices
• 5X Blend “One
One”
BASICS BATCHING LIGHTING
SHADERS
BASICS BATCHING LIGHTING
SHADERS
https://github.com/RChehowski/devgamm_expo
• 2K triangles
• 4K vertices
• 1 проход
BASICS BATCHING LIGHTING
SHADERS
ОПТИМИЗАЦИЯ ШЕЙДЕРНОГО КОДА
• Используйте апроксимации.
• Упрощайте математику.
• Переносите код из пиксельного шейдера в вершинный
• Не пренебрегайте интринсиками и векторизацией
• По возможности, избегайте ветвления в шейдере
• Используйте ARB_precision_hint
• При необходимости – редактируйте сгенерировнный Unity код
BASICS BATCHING LIGHTING
SHADERS
float x = (v1 * merge) + (v2 * (1.0 – merge));
float x = lerp(v1, v2, merge);
• Не изобретайте велосипед. Почти все уже реализовано в языке
HLSL.
• Иногда удобно использовать интринсики не по прямому
назначению.
ИНТРИНСИКИ
float4 result = dot(float4(0.3, 0.59, 0.11, 1.0), myColor);
• Не забывайте про min(), max(), abs(), mad(), и т.д.
BASICS BATCHING LIGHTING
SHADERS
ВЕКТОРИЗАЦИ
Я
return a.yzx * b.zxy - a.zxy * b.yzx;
return float3(
a.y * b.z - a.z * b.y,
a.z * b.x - a.x * b.z,
a.z * b.y - a.y * b.z
);
• В HLSL скаляры это одномерные векторы, поэтому:
return float3(var, var, var);
• Вы можете делать swizzle в любом, удобном Вам порядке
return var.xxx;
(а вообще, это cross(a,
b))
BASICS BATCHING LIGHTING
SHADERS
if(x == 0)
return a;
else if(x == 1)
return b;
return lerp(a, b, floor(x));
• Постарайтесь избегать ветвления для тривиальных
случаев
• В некоторых случаях, ветвление все-таки лучше:
if(x == 0)
очень
много
кода
else if(x == 1)
clip(-1)
BRANCHING
BASICS BATCHING LIGHTING
SHADERS
struct VertexData {
float a : TEXCOORD0;
float b : TEXCOORD1;
float c : TEXCOORD2;
float d : TEXCOORD3;
};
myMaterial.SetFloat(„a”, 1.0f);
myMaterial.SetFloat(„b”, 2.0f);
myMaterial.SetFloat(„c”, 3.0f);
myMaterial.SetFloat(„d”, 4.0f);
struct VertexData {
float4 abcd : TEXCOORD0;
};
myMaterial.SetVector(
„abcd”,
new Vector4(1.0f, 2.0f, 3.0f, 4.0f
);
• Позволяет заменить 4 вызова glUniform1fv одним вызовом
glUniform4fv
УПАКОВКА
BASICS BATCHING LIGHTING
SHADERS
Вставьте этот код вместо исходного кода Вашего
шейдера
BASICS BATCHING LIGHTING
SHADERS
ВЫВОДЫ
• Процесс оптимизации должен быть достаточно детерминирован
• Оптимизировать можно только финальную версию игры или
модуля
• Во время оптимизации Вы снова возвращаетесь к задаче и в
процессе можете решить проблему, которая казалась
неразрешимой или была оставлена на «и так сойдет…»
СПАСИБО ЗА ВНИМАНИЕ
– Вопросы…?
roman.chehowski@vizor-
interactive.by
inangwis

More Related Content

What's hot

Доклад в Mail.ru 01.11.12
Доклад в Mail.ru 01.11.12Доклад в Mail.ru 01.11.12
Доклад в Mail.ru 01.11.12Alex Tutubalin
 
Пишем самый быстрый хеш для кэширования данных
Пишем самый быстрый хеш для кэширования данныхПишем самый быстрый хеш для кэширования данных
Пишем самый быстрый хеш для кэширования данныхRoman Elizarov
 
Перевірка і оптимізація верстки
Перевірка і оптимізація версткиПеревірка і оптимізація верстки
Перевірка і оптимізація версткиStfalcon Meetups
 
Multithreading in JS. Myth or reality?
Multithreading in JS. Myth or reality?Multithreading in JS. Myth or reality?
Multithreading in JS. Myth or reality?Alexander Syrotenko
 
ML on the Edge - Highload++ Siberia 2019
ML on the Edge - Highload++ Siberia 2019ML on the Edge - Highload++ Siberia 2019
ML on the Edge - Highload++ Siberia 2019Andrey Tatarinov
 
Практический опыт использования некоторых современных решений репликации MySQL
Практический опыт использования некоторых современных решений репликации MySQLПрактический опыт использования некоторых современных решений репликации MySQL
Практический опыт использования некоторых современных решений репликации MySQLAlex Chistyakov
 
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)Ontico
 
Interactive Lab: Разработка Flash игр на Unity3D
Interactive Lab: Разработка Flash игр на Unity3DInteractive Lab: Разработка Flash игр на Unity3D
Interactive Lab: Разработка Flash игр на Unity3DDevGAMM Conference
 
Производительность WebGL-приложений / Дмитренко Кирилл (Яндекс)
Производительность WebGL-приложений / Дмитренко Кирилл (Яндекс)Производительность WebGL-приложений / Дмитренко Кирилл (Яндекс)
Производительность WebGL-приложений / Дмитренко Кирилл (Яндекс)Ontico
 

What's hot (9)

Доклад в Mail.ru 01.11.12
Доклад в Mail.ru 01.11.12Доклад в Mail.ru 01.11.12
Доклад в Mail.ru 01.11.12
 
Пишем самый быстрый хеш для кэширования данных
Пишем самый быстрый хеш для кэширования данныхПишем самый быстрый хеш для кэширования данных
Пишем самый быстрый хеш для кэширования данных
 
Перевірка і оптимізація верстки
Перевірка і оптимізація версткиПеревірка і оптимізація верстки
Перевірка і оптимізація верстки
 
Multithreading in JS. Myth or reality?
Multithreading in JS. Myth or reality?Multithreading in JS. Myth or reality?
Multithreading in JS. Myth or reality?
 
ML on the Edge - Highload++ Siberia 2019
ML on the Edge - Highload++ Siberia 2019ML on the Edge - Highload++ Siberia 2019
ML on the Edge - Highload++ Siberia 2019
 
Практический опыт использования некоторых современных решений репликации MySQL
Практический опыт использования некоторых современных решений репликации MySQLПрактический опыт использования некоторых современных решений репликации MySQL
Практический опыт использования некоторых современных решений репликации MySQL
 
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)
 
Interactive Lab: Разработка Flash игр на Unity3D
Interactive Lab: Разработка Flash игр на Unity3DInteractive Lab: Разработка Flash игр на Unity3D
Interactive Lab: Разработка Flash игр на Unity3D
 
Производительность WebGL-приложений / Дмитренко Кирилл (Яндекс)
Производительность WebGL-приложений / Дмитренко Кирилл (Яндекс)Производительность WebGL-приложений / Дмитренко Кирилл (Яндекс)
Производительность WebGL-приложений / Дмитренко Кирилл (Яндекс)
 

Similar to Unity_ Handmade graphics optimizations by Roman Chehowski

Porting existing games to Apple Metal API. Case study: Divinity Original Sin ...
Porting existing games to Apple Metal API. Case study: Divinity Original Sin ...Porting existing games to Apple Metal API. Case study: Divinity Original Sin ...
Porting existing games to Apple Metal API. Case study: Divinity Original Sin ...DevGAMM Conference
 
Git in Sky presentation @ HighLoad++ 2013
Git in Sky presentation @ HighLoad++ 2013Git in Sky presentation @ HighLoad++ 2013
Git in Sky presentation @ HighLoad++ 2013Serguei Gitinsky
 
Многопоточность в играх. Игорь Лобанчиков. CoreHard Spring 2019
Многопоточность в играх. Игорь Лобанчиков. CoreHard Spring 2019Многопоточность в играх. Игорь Лобанчиков. CoreHard Spring 2019
Многопоточность в играх. Игорь Лобанчиков. CoreHard Spring 2019corehard_by
 
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)Ontico
 
How to cook a blockchain and not get burned
How to cook a blockchain and not get burned How to cook a blockchain and not get burned
How to cook a blockchain and not get burned Alexander Syrotenko
 
TК°Conf. Организация разработки Frontend. Виталий Слободин.
TК°Conf. Организация разработки Frontend. Виталий Слободин.TК°Conf. Организация разработки Frontend. Виталий Слободин.
TК°Conf. Организация разработки Frontend. Виталий Слободин.TKConf
 
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...Yandex
 
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...Ontico
 
SECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли UnitySECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли UnitySECON
 
Обзор перспективных баз данных для highload / Юрий Насретдинов
Обзор перспективных баз данных для highload / Юрий НасретдиновОбзор перспективных баз данных для highload / Юрий Насретдинов
Обзор перспективных баз данных для highload / Юрий НасретдиновOntico
 
Character creation pipeline for Age of Magic (3D mobile)
Character creation pipeline for Age of Magic (3D mobile)Character creation pipeline for Age of Magic (3D mobile)
Character creation pipeline for Age of Magic (3D mobile)DevGAMM Conference
 
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...IT-Portfolio
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Ontico
 
NVMf: 5 млн IOPS по сети своими руками / Андрей Николаенко (IBS)
NVMf: 5 млн IOPS по сети своими руками / Андрей Николаенко (IBS)NVMf: 5 млн IOPS по сети своими руками / Андрей Николаенко (IBS)
NVMf: 5 млн IOPS по сети своими руками / Андрей Николаенко (IBS)Ontico
 
Андрей Николаенко, IBS. NVMf: 5 млн IOPS по сети своими руками
Андрей Николаенко, IBS. NVMf: 5 млн IOPS по сети своими рукамиАндрей Николаенко, IBS. NVMf: 5 млн IOPS по сети своими руками
Андрей Николаенко, IBS. NVMf: 5 млн IOPS по сети своими рукамиIBS
 
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)Ontico
 
Daemons In Web on #devrus
Daemons In Web on #devrusDaemons In Web on #devrus
Daemons In Web on #devrusAlex Chistyakov
 
20100314 virtualization igotti_lecture06
20100314 virtualization igotti_lecture0620100314 virtualization igotti_lecture06
20100314 virtualization igotti_lecture06Computer Science Club
 

Similar to Unity_ Handmade graphics optimizations by Roman Chehowski (20)

Porting existing games to Apple Metal API. Case study: Divinity Original Sin ...
Porting existing games to Apple Metal API. Case study: Divinity Original Sin ...Porting existing games to Apple Metal API. Case study: Divinity Original Sin ...
Porting existing games to Apple Metal API. Case study: Divinity Original Sin ...
 
Git in Sky presentation @ HighLoad++ 2013
Git in Sky presentation @ HighLoad++ 2013Git in Sky presentation @ HighLoad++ 2013
Git in Sky presentation @ HighLoad++ 2013
 
Многопоточность в играх. Игорь Лобанчиков. CoreHard Spring 2019
Многопоточность в играх. Игорь Лобанчиков. CoreHard Spring 2019Многопоточность в играх. Игорь Лобанчиков. CoreHard Spring 2019
Многопоточность в играх. Игорь Лобанчиков. CoreHard Spring 2019
 
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
 
How to cook a blockchain and not get burned
How to cook a blockchain and not get burned How to cook a blockchain and not get burned
How to cook a blockchain and not get burned
 
TК°Conf. Организация разработки Frontend. Виталий Слободин.
TК°Conf. Организация разработки Frontend. Виталий Слободин.TК°Conf. Организация разработки Frontend. Виталий Слободин.
TК°Conf. Организация разработки Frontend. Виталий Слободин.
 
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
 
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
 
JavaFX 2.0 overview
JavaFX 2.0 overviewJavaFX 2.0 overview
JavaFX 2.0 overview
 
SECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли UnitySECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли Unity
 
Обзор перспективных баз данных для highload / Юрий Насретдинов
Обзор перспективных баз данных для highload / Юрий НасретдиновОбзор перспективных баз данных для highload / Юрий Насретдинов
Обзор перспективных баз данных для highload / Юрий Насретдинов
 
Character creation pipeline for Age of Magic (3D mobile)
Character creation pipeline for Age of Magic (3D mobile)Character creation pipeline for Age of Magic (3D mobile)
Character creation pipeline for Age of Magic (3D mobile)
 
High Load
High LoadHigh Load
High Load
 
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
 
NVMf: 5 млн IOPS по сети своими руками / Андрей Николаенко (IBS)
NVMf: 5 млн IOPS по сети своими руками / Андрей Николаенко (IBS)NVMf: 5 млн IOPS по сети своими руками / Андрей Николаенко (IBS)
NVMf: 5 млн IOPS по сети своими руками / Андрей Николаенко (IBS)
 
Андрей Николаенко, IBS. NVMf: 5 млн IOPS по сети своими руками
Андрей Николаенко, IBS. NVMf: 5 млн IOPS по сети своими рукамиАндрей Николаенко, IBS. NVMf: 5 млн IOPS по сети своими руками
Андрей Николаенко, IBS. NVMf: 5 млн IOPS по сети своими руками
 
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
 
Daemons In Web on #devrus
Daemons In Web on #devrusDaemons In Web on #devrus
Daemons In Web on #devrus
 
20100314 virtualization igotti_lecture06
20100314 virtualization igotti_lecture0620100314 virtualization igotti_lecture06
20100314 virtualization igotti_lecture06
 

Unity_ Handmade graphics optimizations by Roman Chehowski

  • 1.
  • 2. • OPTIMIZATION BASICS • BATCHING • LIGHTING • SHADERS WORDS TO SAY
  • 3. BASICS BATCHING LIGHTING SHADERS «В предыдущей серии» Рендер, шейдеры, пост-процессинг, etc. <DevGamm! Minsk 2014> • Mobile engine/tools developer в Vizor Intreractive. • В прошлом – программист графики Unity3D в Steel Monkeys. • 3 года опыта работы с графикой (Adobe flash, DirectX, OpenGL, Metal) • Работал с большим количеством open- source игровых движков
  • 5. КОГДА ОПТИМИЗИРОВАТЬ ГРАФИКУ • «Не сейчас» (с) Сначала получите приемлемый результат. • Когда производительность приложения на целевых устройствах Вас не устраивает. • Вместе с гейм-дизайнером – для решения вопросов об игровой стилистике. • Вместе с 2D/3D художником – для быстрой переделки игровых ресурсов. BASICS BATCHING LIGHTING SHADERS
  • 6. ФОРМАЛИЗАЦИЯ • Что визуально изменится для игрока? • Каковы преимущества и недостатки оптимизации? • Какие игровые ресурсы нужно будет переделывать? • Какой код нужно переписывать (и кто будет это делать)? • Сколько времени займет оптимизация? • Энтропия (Что может не заработать?). В процессе формализации, Вы отвечаете на вопросы: «Что именно я делаю?» и «Сколько времени это займет?» BASICS BATCHING LIGHTING SHADERS
  • 7. ПРОФИЛИРОВАНИЕ • Не считайте попугаев (FPS, draw calls), замеряйте время. • Не замеряйте производительность в сферическом вакууме. • Создавайте тесты для быстрого получения результатов. • Записывайте render time, а не frame time (это исключит из результата swap buffer delay и vSync). • Обязательно оценивайте «до/после» только по достижении планируемого результата. • Получив массив результатов времени, берите медиану, а не среднее арифметическое, иначе рискуете получить «среднюю температуру по больнице». BASICS BATCHING LIGHTING SHADERS
  • 8. ПРОФИЛИРОВАНИЕ UNITY-ПРОФАЙЛЕРОМ • Время Camera.Render() в профайлере – это именно то, что Вам нужно. • Напишите простенький MonoBehaviour: • OnPreCull() – начало фрейма • OnPostRender() – конец фрейма • OnGUI() – для вывода результата BASICS BATCHING LIGHTING SHADERS
  • 9. General-purpose tools • Unity profiler • GDebugger (OpenGL desktop) • Microsoft PiX (DirectX 9) • ADB GL tracer (android) • xCode instruments (iOS) Platform-specific tools: • Adreno profiler (Qualcomm Adreno) • PerfHUD ES (NVidia Tegra) • Mali profiler (ARM Mali) • PVRTune (Imagination tec PowerVR) На личном опыте: • Mali – самая проблемная • Tegra – самая медленная • PowerVR – самая производительная BASICS BATCHING LIGHTING SHADERS
  • 10. БАЗОВЫЙ ПОДХОД: • Упрощайте шейдеры • Упрощайте пост-процессинг • Используйте меньше transparent-объектов • Подключайте LOD’ы • Используйте Material ID • Запекайте цвет и свойства материалов в vertexColor и uv2 • Используйте native-текстуры • Снижайте Fillrate • Включайте оптимизацию Mesh’ей BASICS BATCHING LIGHTING SHADERS
  • 11. Static batching: (+) • Не нужно постоянно перезаписывать VBO. • Меньше нагрузка на CPU, так как не нужно трансформировать вершины в runtime. • Немного меньше matrix multiplications в runtime. (-) • Рендер создает физическую копию забатченной геометрии. • Нет возможности перемещать статически забатченные объекты. • Для работы frustum и occlusion culling’a требуется динамическая перезапись index buffer. BASICS BATCHING LIGHTING SHADERS
  • 12. model matrix position world position _Object2World – model matrix _World2Object – inverse model matrix UNITY_MATRIX_MVP – model-view-projection matrix BASICS BATCHING LIGHTING SHADERS
  • 16. [0] [1] [2] [3] [4] BASICS BATCHING LIGHTING SHADERS
  • 18. • Используйте как можно меньше динамических источников освещения на сцене • Уменьшайте количество «per- pixel lights в Quality Settings. • Помечайте второстепенные источники света как «non- important» • При огромном количестве источников освещения – подключайте Deferred shading • Не слишком полагайтесь на Surface шейдеры. LIGHTING BASICS BATCHING LIGHTING SHADERS
  • 19. • SubShader: • Forward base • GLES • Base • KEYWORD_A • KEYWORD_B ... • Shadow caster • Shadow collector • DX9 • WP8 • Playstation 3 … • Forward add • Prepass base • Prepass final Shader "Custom/NewShader" { Properties { _MainTex("Base (RGB)", 2D) = "white" {} } SubShader { Tags { "RenderType"="Opaque" } LOD 200 CGPROGRAM #pragma surface surf Lambert sampler2D _MainTex; struct Input { float2 uv_MainTex; }; void surf (Input IN, inout SurfaceOutput o) { half4 c = tex2D(_MainTex, IN.uv_MainTex); o.Albedo = c.rgb; o.Alpha = c.a; } ENDCG } FallBack "Diffuse" } Варианты Вашего шейдера: BASICS BATCHING LIGHTING SHADERS
  • 20. • 12K triangles • 24K vertices • 5X Blend “One One” BASICS BATCHING LIGHTING SHADERS
  • 22. • 2K triangles • 4K vertices • 1 проход BASICS BATCHING LIGHTING SHADERS
  • 23. ОПТИМИЗАЦИЯ ШЕЙДЕРНОГО КОДА • Используйте апроксимации. • Упрощайте математику. • Переносите код из пиксельного шейдера в вершинный • Не пренебрегайте интринсиками и векторизацией • По возможности, избегайте ветвления в шейдере • Используйте ARB_precision_hint • При необходимости – редактируйте сгенерировнный Unity код BASICS BATCHING LIGHTING SHADERS
  • 24. float x = (v1 * merge) + (v2 * (1.0 – merge)); float x = lerp(v1, v2, merge); • Не изобретайте велосипед. Почти все уже реализовано в языке HLSL. • Иногда удобно использовать интринсики не по прямому назначению. ИНТРИНСИКИ float4 result = dot(float4(0.3, 0.59, 0.11, 1.0), myColor); • Не забывайте про min(), max(), abs(), mad(), и т.д. BASICS BATCHING LIGHTING SHADERS
  • 25. ВЕКТОРИЗАЦИ Я return a.yzx * b.zxy - a.zxy * b.yzx; return float3( a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.z * b.y - a.y * b.z ); • В HLSL скаляры это одномерные векторы, поэтому: return float3(var, var, var); • Вы можете делать swizzle в любом, удобном Вам порядке return var.xxx; (а вообще, это cross(a, b)) BASICS BATCHING LIGHTING SHADERS
  • 26. if(x == 0) return a; else if(x == 1) return b; return lerp(a, b, floor(x)); • Постарайтесь избегать ветвления для тривиальных случаев • В некоторых случаях, ветвление все-таки лучше: if(x == 0) очень много кода else if(x == 1) clip(-1) BRANCHING BASICS BATCHING LIGHTING SHADERS
  • 27. struct VertexData { float a : TEXCOORD0; float b : TEXCOORD1; float c : TEXCOORD2; float d : TEXCOORD3; }; myMaterial.SetFloat(„a”, 1.0f); myMaterial.SetFloat(„b”, 2.0f); myMaterial.SetFloat(„c”, 3.0f); myMaterial.SetFloat(„d”, 4.0f); struct VertexData { float4 abcd : TEXCOORD0; }; myMaterial.SetVector( „abcd”, new Vector4(1.0f, 2.0f, 3.0f, 4.0f ); • Позволяет заменить 4 вызова glUniform1fv одним вызовом glUniform4fv УПАКОВКА BASICS BATCHING LIGHTING SHADERS
  • 28. Вставьте этот код вместо исходного кода Вашего шейдера BASICS BATCHING LIGHTING SHADERS
  • 29. ВЫВОДЫ • Процесс оптимизации должен быть достаточно детерминирован • Оптимизировать можно только финальную версию игры или модуля • Во время оптимизации Вы снова возвращаетесь к задаче и в процессе можете решить проблему, которая казалась неразрешимой или была оставлена на «и так сойдет…»
  • 30. СПАСИБО ЗА ВНИМАНИЕ – Вопросы…? roman.chehowski@vizor- interactive.by inangwis