SlideShare a Scribd company logo
1 of 90
Производительность
Unity3D:
подводные камни
Алексей Чубарь, BIT.GAMES
Unity3D
Рендеринг
Анимации
Звук
Физика
Редактор
Оптимизация
…
Unity3D
Unity3D
Unity3D
Unity3D
9 FPS
ШМЯК, БРЯК
И В ПРОДАКШН
Unity3D
PC & Console games Mobile games
Architectural visualizations
Medical simulations
Military simulations
CAD
Research
Interactive presentations
…
Education
Media & movies
Art installations
Unity3D
PC & Console games Mobile games
Architectural visualizations
Medical simulations
Military simulations
CAD
Research
Interactive presentations
…
Education
Media & movies
Art installations
Суровый мир мобильных игр
Суровый мир мобильных игр
• Высокая конкуренция
Суровый мир мобильных игр
• Высокая конкуренция
• Специфика аудитории
Суровый мир мобильных игр
• Высокая конкуренция
• Специфика аудитории
• Специфика программно-аппаратной платформы
Что там внутри?
• Какой-то странный процессор
• ARM, x86, MIPS… 32 и 64 bit.
• Какой-то странный процессор
• ARM, x86, MIPS… 32 и 64 bit.
Что там внутри?
≠
Что там внутри?
• Какая-то батарейка
Что там внутри?
• Какой-то графический ускоритель
≠
Что там внутри?
• Какая-то оперативная память
• Её всегда мало
Зоопарк устройств
Зоопарк устройств
240 MB
ought to be enough for anyone – Gill Bates
• Падение FPS.
• Чёрные квадраты вместо текстур.
• «Тихое» завершение приложения без отчёта об ошибке.
Зоопарк устройств
>240 MB
Главный совет
“Make optimization a design consideration, not a final step”
- Unity Docs
Главный совет
“Make optimization a design consideration, not a final step”
- Unity Docs
Постоянно спрашивай себя: “А не ерунду ли я сейчас делаю?”
- Примерный перевод
Из-за чего всё тормозит?
Из-за чего всё тормозит?
• Код
Из-за чего всё тормозит?
• Код • Ресурсы
Импорт ресурсов
Импорт ресурсов: звук
Импорт ресурсов: звук
16 bit * 44100 Hz * 2 channels = 176.4 KB/s
Импорт ресурсов: звук
16 bit * 44100 Hz * 2 channels = 176.4 KB/s
Импорт ресурсов: звук
• Сжатие MP3 на iOS
• Сжатие Vorbis на Android
• Force Mono
• Низкий битрейт (насколько возможно)
≠
Импорт ресурсов: анимации
Импорт ресурсов: анимации
• Сложные анимации занимают много памяти. KISS.
Импорт ресурсов: анимации
• Сложные анимации занимают много памяти. KISS.
• Анимация большого числа объектов нагружает ЦП.
Импорт ресурсов: анимации
• Сложные анимации занимают много памяти. KISS.
• Анимация большого числа объектов нагружает ЦП.
• Можно уменьшить количество объектов.
Импорт ресурсов: анимации
• Сложные анимации занимают много памяти. KISS.
• Анимация большого числа объектов нагружает ЦП.
• Можно уменьшить количество объектов.
• Можно упростить объекты.
?!
Импорт ресурсов: 3D-модели
• Отключите Read/Write.
• Много полигонов = много памяти.
• Optimize Mesh Data.
Импорт ресурсов: 3D-модели
Точно ли это всё понадобится?
Импорт ресурсов: текстуры
• Сжатие обязательно
Android: ETC iOS: PVRTC
Импорт ресурсов: текстуры
RGB ETC 4 bit,
1024х1024: 512KB
RGBA 32 bit,
1024х1024: 4MB
Alpha ETC 4 bit,
512x512: 128KB
-84%
Импорт ресурсов: текстуры
RGB ETC 4 bit,
1024х1024: 512KB
RGBA 32 bit,
1024х512: 2MB
Alpha ETC 4 bit,
512x512: 128KB
-69%
• Не включайте Read/Write.
• Отключите mipmaps, если возможно.
• Не используйте огромные текстуры.
• 2048x2048 или 1024x1024 для UI
• 512x512 или меньше для текстур моделей
Импорт ресурсов: текстуры
*Допустимо, если есть запас производительности GPU
-50%
-33%*
Fillrate & overdraw
OK
Overdrawn
Борьба с overdraw
High-res
background parts
Lower-res
RenderTexture
High-DPI Device
Борьба с overdraw
High-res
background parts
Lower-res
RenderTexture
High-DPI Device
Можно переиспользовать,
если камера не движется
Борьба с overdraw
Нагрузка на GPU ниже,
когда камера статична
Код и runtime
Код и runtime
C# code
JS code
UnityScript
code
CIL
CIL
CIL
Assembly.dll
Sources Script compiler Mono runtime
JIT
AOT
Код и runtime
C# code
JS code
UnityScript
code
CIL
CIL
CIL
Assembly.dll
Sources Script compiler Mono runtime
JIT
AOT
Код и runtime
• Сборка мусора работает плохо.
• Heap удваивается при достижении лимита. И не уменьшается никогда.
• Производительность игры со временем снижается.
Код и runtime: Garbage collection
ReferenceType
class Entry {
uint id;
long phone;
string name;
}
Thread stack (FAST)
var e1 = new Entry();
var e2 = e1;
Managed heap (SLOW)
ref1
Entry
id: 1337
phone: 88005553535
name: ref2
String
value: “Ayy Lmao”
ref3
Код и runtime: Garbage collection
ValueType
struct Entry {
uint id;
long phone;
string name;
}
Thread stack (FAST)
var e1 = new Entry();
var e2 = e1;
Managed heap (SLOW)
Entry
id: 1337
phone: 88005553535
name: ref1
String
value: “Ayy Lmao”
Entry (сopy)
id: 740
phone: 88005553535
name: ref2e2.id = 740;
Код и runtime: аллокации
• ValueType вместо ReferenceType, где уместно.
Код и runtime: аллокации
• ValueType вместо ReferenceType, где уместно.
• Меньше временных объектов, аллоцируй однажды и переиспользуй.
Код и runtime: аллокации
Refactor
public static class Modifiers
{
public List<Modifier> GetAll()
{
var tmp = new List<Modifier>();
FillStuff(tmp);
return tmp;
}
}
public static class Modifiers
{
public void GetAll(List<Modifier> to_fill)
{
to_fill.Clear();
FillStuff(to_fill);
}
}
public void Update()
{
List<Modifier> modifiers = Modifiers.GetAll();
DisplayModifiers(modifiers);
}
List<Modifier> = new List<Modifier>(CAPACITY);
public void Update()
{
Modifiers.GetAll(modifiers);
DisplayModifiers(modifiers);
}
Код и runtime: аллокации
• ValueType вместо ReferenceType, где уместно.
• Меньше временных объектов, аллоцируй однажды и переиспользуй.
• «Гибридные» контейнеры.
Код и runtime: аллокации
struct HList<T> : IList<T>
гибридный контейнер
T val0;
T val1;
T val2;
T val3;
List<T> fallback; T TT ...
myHList.Add(newVal);
Count >
Capacity?
True,
alloc fallback once
False,
no allocs
Код и runtime: неявные аллокации
• Regex;
Код и runtime: неявные аллокации
• Regex;
• “Excessive” + “ strings “ + “concat”;
Код и runtime: неявные аллокации
• Regex;
• “Excessive” + “ strings “ + “concat”;
• Closures & anon methods;
public void LoginWithID(int id)
{
if(IsLoggedIn())
return;
LoginWithDelegate(
delegate() { ProcessNewID(id); }
);
}
Вы ещё здесь…
… а эти объекты
уже созданы в heap.
“id” используется в closure,
копия создаётся в heap.
Код и runtime: неявные аллокации
• Regex;
• “Excessive” + “ strings “ + “concat”;
• Closures & anon methods;
• LINQ;
Код и runtime: неявные аллокации
• Regex;
• “Excessive” + “ strings “ + “concat”;
• Closures & anon methods;
• LINQ;
• foreach;
Код и runtime: неявные аллокации
• Regex;
• “Excessive” + “ strings “ + “concat”;
• Closures & anon methods;
• LINQ;
• foreach;
• using;
Код и runtime: неявные аллокации
• Regex;
• “Excessive” + “ strings “ + “concat”;
• Closures & anon methods;
• LINQ;
• foreach;
• using;
• Array.IndexOf и т.п.;
• …
Код и runtime: boxing
struct Entry : IPrintable
Thread stack
var e1 = new Entry();
Entry
Managed heapvoid MyPrint(IPrintable p)
Object (boxed Entry)
IPrintable toPrint = e1;
MyPrint(toPrint); IPrintable ref1
Неявная аллокация
Код и runtime: аллокации Unity API
SkinnedMeshRenderer smr = ...;
for(int i = 0; i < smr.bones.Length; i++)
{
//... Do stuff
}
SkinnedMeshRenderer smr = ...;
var bones = smr.bones;
for(int i = 0; i < bones.Length; i++)
{
//... Do stuff
}
Код и runtime: аллокации Unity API
SkinnedMeshRenderer smr = ...;
for(int i = 0; i < smr.bones.Length; i++)
{
//... Do stuff
}
SkinnedMeshRenderer smr = ...;
var bones = smr.bones;
for(int i = 0; i < bones.Length; i++)
{
//... Do stuff
}
Аллоцирует массив “bones”
bones.Length раз
Аллоцирует массив “bones”
1 раз
Код и runtime: аллокации Unity API
• Если Unity API возвращает массив, будет создана новая копия.
Код и runtime: аллокации Unity API
• Если Unity API возвращает массив, будет создана новая копия.
• Каждый раз.
Код и runtime: аллокации Unity API
• Если Unity API возвращает массив, будет создана новая копия.
• Каждый раз.
• Даже если значение не изменилось.
Код и runtime: аллокации Unity API
• Если Unity API возвращает массив, будет создана новая копия.
• Каждый раз.
• Даже если значение не изменилось.
• Даже если это выглядит как безобидный getter.
Код и runtime: аллокации Unity API
• Если Unity API возвращает массив, будет создана новая копия.
• Каждый раз.
• Даже если значение не изменилось.
• Даже если это выглядит как безобидный getter.
• «Безобидный getter» может скрывать внутри тяжёлые вычисления.
public string name {
get {
return BadWordsFilter.ReplaceAll(data.name.Unescape());
}
}
Код и runtime: прочее
• No inlining.
• Вызов метода С# = вызов в машинном коде.
• Property accessors = вызов метода.
• Это сказывается на скорости интенсивных вычислений.
• Do inlining yourself.
Код и runtime: прочее
• К свойствам некоторых компонентов можно обращаться по
имени (Animator, Shader, Material).
• Внутри имя каждый раз преобразовывается в хэш.
• Вычисли хэш однажды и переиспользуй.
material.SetColor(“_Color”, Color.white);
animator.SetTrigger(“attack”);
static readonly int HASH_MAT_COLOR = Shader.PropertyToID(“_Color”);
static readonly int HASH_ANIM_ATTACK = Animator.StringToHash(“attack”);
material.SetColor(HASH_MAT_COLOR, Color.white);
animator.SetTrigger(HASH_ANIM_ATTACK);
Код и runtime: прочее
• Reflection is slow.
• Text parsing is slow.
• Text parsers based on Reflection are super slow.
Профайлинг
Профайлинг
• Встроенный профайлер Unity.
Профайлинг
• Встроенный профайлер Unity.
• XCode Instruments.
Профайлинг
Скорость
итераций
Сложность
интерпретации
Точность
Поддержка
ОС
Unity
(редактор)
Очень
высокая
Низкая Низкая -
Unity
(устройство)
Низкая Низкая Средняя Любая
XCode
Instruments
Низкая Средняя
Очень
высокая
Только iOS
Профайлинг
140.1 MB
Unity
Профайлинг: Unity врёт
140.1 MB
262.0 MB
Unity
XCode
Профайлинг: Unity врёт
140.1 MB
262.0 MB
Unity
XCode
Summary
• Специфика мобильных платформ должна учитываться на всех этапах
разработки.
Summary
• Специфика мобильных платформ должна учитываться на всех этапах
разработки.
• Экономить RAM не менее важно, чем ресурс CPU и GPU.
Summary
• Специфика мобильных платформ должна учитываться на всех этапах
разработки.
• Экономить RAM не менее важно, чем ресурс CPU и GPU.
• Разумный компромисс «Качество vs. Память» для ассетов, сжатие.
Summary
• Специфика мобильных платформ должна учитываться на всех этапах
разработки.
• Экономить RAM не менее важно, чем ресурс CPU и GPU.
• Разумный компромисс «Качество vs. Память» для ассетов, сжатие.
• Избегай overdraw.
Summary
• Специфика мобильных платформ должна учитываться на всех этапах
разработки.
• Экономить RAM не менее важно, чем ресурс CPU и GPU.
• Разумный компромисс «Качество vs. Память» для ассетов, сжатие.
• Избегай overdraw.
• Избегай аллокаций и boxing’а.
Summary
• Специфика мобильных платформ должна учитываться на всех этапах
разработки.
• Экономить RAM не менее важно, чем ресурс CPU и GPU.
• Разумный компромисс «Качество vs. Память» для ассетов, сжатие.
• Избегай overdraw.
• Избегай аллокаций и boxing’а.
• Помни особенности Unity Mono Runtime. («heap never shrinks»)
Summary
• Специфика мобильных платформ должна учитываться на всех этапах
разработки.
• Экономить RAM не менее важно, чем ресурс CPU и GPU.
• Разумный компромисс «Качество vs. Память» для ассетов, сжатие.
• Избегай overdraw.
• Избегай аллокаций и boxing’а.
• Помни особенности Unity Mono Runtime. («heap never shrinks»)
• Помни особенности Unity API. («no inlining», «arrays always allocated»)
Summary
• Специфика мобильных платформ должна учитываться на всех этапах
разработки.
• Экономить RAM не менее важно, чем ресурс CPU и GPU.
• Разумный компромисс «Качество vs. Память» для ассетов, сжатие.
• Избегай overdraw.
• Избегай аллокаций и boxing’а.
• Помни особенности Unity Mono Runtime. («heap never shrinks»)
• Помни особенности Unity API. («no inlining», «arrays always allocated»)
• Профайлить надо. Часто. Через Instruments.
Спасибо за внимание

More Related Content

What's hot

Как и зачем создавать NginX-модуль - теория, практика, профит / Василий Сошни...
Как и зачем создавать NginX-модуль - теория, практика, профит / Василий Сошни...Как и зачем создавать NginX-модуль - теория, практика, профит / Василий Сошни...
Как и зачем создавать NginX-модуль - теория, практика, профит / Василий Сошни...Ontico
 
Клиентские приложения под нагрузкой (HighLoad 2014)
Клиентские приложения под нагрузкой (HighLoad 2014)Клиентские приложения под нагрузкой (HighLoad 2014)
Клиентские приложения под нагрузкой (HighLoad 2014)Andrey Smirnov
 
Android Cloud... точнее Cloud из Android / Охрименко Алексей (Acronis)
Android Cloud... точнее Cloud из Android / Охрименко Алексей (Acronis)Android Cloud... точнее Cloud из Android / Охрименко Алексей (Acronis)
Android Cloud... точнее Cloud из Android / Охрименко Алексей (Acronis)Ontico
 
Как собирать gps треки раз в секунду, экономя траффик
Как собирать gps треки раз в секунду, экономя траффикКак собирать gps треки раз в секунду, экономя траффик
Как собирать gps треки раз в секунду, экономя траффикAndrew Minkin
 
Анатомия веб сервиса (HighLoad-2014)
Анатомия веб сервиса (HighLoad-2014)Анатомия веб сервиса (HighLoad-2014)
Анатомия веб сервиса (HighLoad-2014)Andrey Smirnov
 
Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...
Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...
Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...Ontico
 
Анатомия веб-сервиса (РИТ-2014)
Анатомия веб-сервиса (РИТ-2014)Анатомия веб-сервиса (РИТ-2014)
Анатомия веб-сервиса (РИТ-2014)Andrey Smirnov
 
Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...
Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...
Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...Ontico
 
Функциональное тестирование высоконагруженных проектов / Илья Пастушков (2ГИС)
Функциональное тестирование высоконагруженных проектов / Илья Пастушков (2ГИС)Функциональное тестирование высоконагруженных проектов / Илья Пастушков (2ГИС)
Функциональное тестирование высоконагруженных проектов / Илья Пастушков (2ГИС)Ontico
 
Highload на GPU, опыт Vinci / Олег Илларионов (ВКонтакте)
Highload на GPU, опыт Vinci / Олег Илларионов (ВКонтакте)Highload на GPU, опыт Vinci / Олег Илларионов (ВКонтакте)
Highload на GPU, опыт Vinci / Олег Илларионов (ВКонтакте)Ontico
 
Консольные приложения на Go
Консольные приложения на GoКонсольные приложения на Go
Консольные приложения на GoAndrey Smirnov
 
Artisto: опыт запуска нейросетей в production / Эдуард Тянтов (Mail.ru Group)
Artisto: опыт запуска нейросетей в production / Эдуард Тянтов (Mail.ru Group)Artisto: опыт запуска нейросетей в production / Эдуард Тянтов (Mail.ru Group)
Artisto: опыт запуска нейросетей в production / Эдуард Тянтов (Mail.ru Group)Ontico
 
Андрей Акиньшин
Андрей АкиньшинАндрей Акиньшин
Андрей АкиньшинCodeFest
 
10 способов достижения HighLoad'а и BigData на ровном месте / Илья Космодемья...
10 способов достижения HighLoad'а и BigData на ровном месте / Илья Космодемья...10 способов достижения HighLoad'а и BigData на ровном месте / Илья Космодемья...
10 способов достижения HighLoad'а и BigData на ровном месте / Илья Космодемья...Ontico
 
Антон Турецкий
Антон ТурецкийАнтон Турецкий
Антон ТурецкийCodeFest
 
Юрий Насретдинов, Badoo
Юрий Насретдинов, BadooЮрий Насретдинов, Badoo
Юрий Насретдинов, BadooOntico
 
OpenResty: превращаем NGINX в полноценный сервер приложений / Владимир Прота...
OpenResty: превращаем NGINX в полноценный сервер приложений  / Владимир Прота...OpenResty: превращаем NGINX в полноценный сервер приложений  / Владимир Прота...
OpenResty: превращаем NGINX в полноценный сервер приложений / Владимир Прота...Ontico
 
Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo)
 Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo) Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo)
Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo)Ontico
 
Дмитрий Стогов
Дмитрий СтоговДмитрий Стогов
Дмитрий СтоговCodeFest
 
Архитектура поиска в Booking.com / Иван Круглов (Booking.com)
Архитектура поиска в Booking.com / Иван Круглов (Booking.com)Архитектура поиска в Booking.com / Иван Круглов (Booking.com)
Архитектура поиска в Booking.com / Иван Круглов (Booking.com)Ontico
 

What's hot (20)

Как и зачем создавать NginX-модуль - теория, практика, профит / Василий Сошни...
Как и зачем создавать NginX-модуль - теория, практика, профит / Василий Сошни...Как и зачем создавать NginX-модуль - теория, практика, профит / Василий Сошни...
Как и зачем создавать NginX-модуль - теория, практика, профит / Василий Сошни...
 
Клиентские приложения под нагрузкой (HighLoad 2014)
Клиентские приложения под нагрузкой (HighLoad 2014)Клиентские приложения под нагрузкой (HighLoad 2014)
Клиентские приложения под нагрузкой (HighLoad 2014)
 
Android Cloud... точнее Cloud из Android / Охрименко Алексей (Acronis)
Android Cloud... точнее Cloud из Android / Охрименко Алексей (Acronis)Android Cloud... точнее Cloud из Android / Охрименко Алексей (Acronis)
Android Cloud... точнее Cloud из Android / Охрименко Алексей (Acronis)
 
Как собирать gps треки раз в секунду, экономя траффик
Как собирать gps треки раз в секунду, экономя траффикКак собирать gps треки раз в секунду, экономя траффик
Как собирать gps треки раз в секунду, экономя траффик
 
Анатомия веб сервиса (HighLoad-2014)
Анатомия веб сервиса (HighLoad-2014)Анатомия веб сервиса (HighLoad-2014)
Анатомия веб сервиса (HighLoad-2014)
 
Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...
Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...
Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...
 
Анатомия веб-сервиса (РИТ-2014)
Анатомия веб-сервиса (РИТ-2014)Анатомия веб-сервиса (РИТ-2014)
Анатомия веб-сервиса (РИТ-2014)
 
Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...
Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...
Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...
 
Функциональное тестирование высоконагруженных проектов / Илья Пастушков (2ГИС)
Функциональное тестирование высоконагруженных проектов / Илья Пастушков (2ГИС)Функциональное тестирование высоконагруженных проектов / Илья Пастушков (2ГИС)
Функциональное тестирование высоконагруженных проектов / Илья Пастушков (2ГИС)
 
Highload на GPU, опыт Vinci / Олег Илларионов (ВКонтакте)
Highload на GPU, опыт Vinci / Олег Илларионов (ВКонтакте)Highload на GPU, опыт Vinci / Олег Илларионов (ВКонтакте)
Highload на GPU, опыт Vinci / Олег Илларионов (ВКонтакте)
 
Консольные приложения на Go
Консольные приложения на GoКонсольные приложения на Go
Консольные приложения на Go
 
Artisto: опыт запуска нейросетей в production / Эдуард Тянтов (Mail.ru Group)
Artisto: опыт запуска нейросетей в production / Эдуард Тянтов (Mail.ru Group)Artisto: опыт запуска нейросетей в production / Эдуард Тянтов (Mail.ru Group)
Artisto: опыт запуска нейросетей в production / Эдуард Тянтов (Mail.ru Group)
 
Андрей Акиньшин
Андрей АкиньшинАндрей Акиньшин
Андрей Акиньшин
 
10 способов достижения HighLoad'а и BigData на ровном месте / Илья Космодемья...
10 способов достижения HighLoad'а и BigData на ровном месте / Илья Космодемья...10 способов достижения HighLoad'а и BigData на ровном месте / Илья Космодемья...
10 способов достижения HighLoad'а и BigData на ровном месте / Илья Космодемья...
 
Антон Турецкий
Антон ТурецкийАнтон Турецкий
Антон Турецкий
 
Юрий Насретдинов, Badoo
Юрий Насретдинов, BadooЮрий Насретдинов, Badoo
Юрий Насретдинов, Badoo
 
OpenResty: превращаем NGINX в полноценный сервер приложений / Владимир Прота...
OpenResty: превращаем NGINX в полноценный сервер приложений  / Владимир Прота...OpenResty: превращаем NGINX в полноценный сервер приложений  / Владимир Прота...
OpenResty: превращаем NGINX в полноценный сервер приложений / Владимир Прота...
 
Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo)
 Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo) Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo)
Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo)
 
Дмитрий Стогов
Дмитрий СтоговДмитрий Стогов
Дмитрий Стогов
 
Архитектура поиска в Booking.com / Иван Круглов (Booking.com)
Архитектура поиска в Booking.com / Иван Круглов (Booking.com)Архитектура поиска в Booking.com / Иван Круглов (Booking.com)
Архитектура поиска в Booking.com / Иван Круглов (Booking.com)
 

Viewers also liked

Что нового в nginx? / Максим Дунин (Nginx, Inc.)
Что нового в nginx? / Максим Дунин (Nginx, Inc.)Что нового в nginx? / Максим Дунин (Nginx, Inc.)
Что нового в nginx? / Максим Дунин (Nginx, Inc.)Ontico
 
Remote Highload / Андрей Смирнов (Virtustream)
Remote Highload / Андрей Смирнов (Virtustream)Remote Highload / Андрей Смирнов (Virtustream)
Remote Highload / Андрей Смирнов (Virtustream)Ontico
 
HHVM: Efficient and Scalable PHP/Hack Execution / Guilherme Ottoni (Facebook)
HHVM: Efficient and Scalable PHP/Hack Execution / Guilherme Ottoni (Facebook)HHVM: Efficient and Scalable PHP/Hack Execution / Guilherme Ottoni (Facebook)
HHVM: Efficient and Scalable PHP/Hack Execution / Guilherme Ottoni (Facebook)Ontico
 
Красиво и не тормозит! Анимация без ущерба для производительности приложений ...
Красиво и не тормозит! Анимация без ущерба для производительности приложений ...Красиво и не тормозит! Анимация без ущерба для производительности приложений ...
Красиво и не тормозит! Анимация без ущерба для производительности приложений ...Ontico
 
Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...
Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...
Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...Ontico
 
Виртуальный ЦОД для корпоративных клиентов на базе Virtuozzo: стабильность, п...
Виртуальный ЦОД для корпоративных клиентов на базе Virtuozzo: стабильность, п...Виртуальный ЦОД для корпоративных клиентов на базе Virtuozzo: стабильность, п...
Виртуальный ЦОД для корпоративных клиентов на базе Virtuozzo: стабильность, п...Ontico
 
Быстрый старт iOS приложения на примере iOS Почты Mail.Ru / Николай Морев (Ma...
Быстрый старт iOS приложения на примере iOS Почты Mail.Ru / Николай Морев (Ma...Быстрый старт iOS приложения на примере iOS Почты Mail.Ru / Николай Морев (Ma...
Быстрый старт iOS приложения на примере iOS Почты Mail.Ru / Николай Морев (Ma...Ontico
 
Cautious: IPv6 is here / Александр Азимов (Qrator Labs)
Cautious: IPv6 is here / Александр Азимов (Qrator Labs)Cautious: IPv6 is here / Александр Азимов (Qrator Labs)
Cautious: IPv6 is here / Александр Азимов (Qrator Labs)Ontico
 
Пользователь точно оценит! Повышение производительности мобильных приложений ...
Пользователь точно оценит! Повышение производительности мобильных приложений ...Пользователь точно оценит! Повышение производительности мобильных приложений ...
Пользователь точно оценит! Повышение производительности мобильных приложений ...Ontico
 
Борьба с DDoS в хостинге - по обе стороны баррикад / Константин Новаковский (...
Борьба с DDoS в хостинге - по обе стороны баррикад / Константин Новаковский (...Борьба с DDoS в хостинге - по обе стороны баррикад / Константин Новаковский (...
Борьба с DDoS в хостинге - по обе стороны баррикад / Константин Новаковский (...Ontico
 
Как поддерживать и развивать пачку "похожих" проектов. Кластер или конгломера...
Как поддерживать и развивать пачку "похожих" проектов. Кластер или конгломера...Как поддерживать и развивать пачку "похожих" проектов. Кластер или конгломера...
Как поддерживать и развивать пачку "похожих" проектов. Кластер или конгломера...Ontico
 
Адаптивная оптимизация запросов в реляционных СУБД / Олег Иванов (Postgres Pr...
Адаптивная оптимизация запросов в реляционных СУБД / Олег Иванов (Postgres Pr...Адаптивная оптимизация запросов в реляционных СУБД / Олег Иванов (Postgres Pr...
Адаптивная оптимизация запросов в реляционных СУБД / Олег Иванов (Postgres Pr...Ontico
 
Эффективная отладка репликации MySQL / Света Смирнова (Percona)
Эффективная отладка репликации MySQL / Света Смирнова (Percona)Эффективная отладка репликации MySQL / Света Смирнова (Percona)
Эффективная отладка репликации MySQL / Света Смирнова (Percona)Ontico
 
Поиск совпадений и дедупликация в потоке / Леонид Юрьев (Positive Technologies)
Поиск совпадений и дедупликация в потоке / Леонид Юрьев (Positive Technologies)Поиск совпадений и дедупликация в потоке / Леонид Юрьев (Positive Technologies)
Поиск совпадений и дедупликация в потоке / Леонид Юрьев (Positive Technologies)Ontico
 
Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт...
 Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт... Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт...
Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт...Ontico
 
Как devops исчерпывает себя, и что будет дальше / Кирилл Вечера (Jetware)
Как devops исчерпывает себя, и что будет дальше / Кирилл Вечера (Jetware)Как devops исчерпывает себя, и что будет дальше / Кирилл Вечера (Jetware)
Как devops исчерпывает себя, и что будет дальше / Кирилл Вечера (Jetware)Ontico
 
Sphinx 3.0, поиск 15 лет спустя / Андрей Аксенов (Sphinx)
Sphinx 3.0, поиск 15 лет спустя / Андрей Аксенов (Sphinx)Sphinx 3.0, поиск 15 лет спустя / Андрей Аксенов (Sphinx)
Sphinx 3.0, поиск 15 лет спустя / Андрей Аксенов (Sphinx)Ontico
 
Нейронные сети на страже индустриальной кибербезопасности / Павел Филонов (Ла...
Нейронные сети на страже индустриальной кибербезопасности / Павел Филонов (Ла...Нейронные сети на страже индустриальной кибербезопасности / Павел Филонов (Ла...
Нейронные сети на страже индустриальной кибербезопасности / Павел Филонов (Ла...Ontico
 
Введение в архитектуры нейронных сетей / Григорий Сапунов (Intento)
Введение в архитектуры нейронных сетей / Григорий Сапунов (Intento)Введение в архитектуры нейронных сетей / Григорий Сапунов (Intento)
Введение в архитектуры нейронных сетей / Григорий Сапунов (Intento)Ontico
 
HDD, SSD, RAM, RAID, и кого на ком кэшировать / Михаил Конюхов (Perfect Solut...
HDD, SSD, RAM, RAID, и кого на ком кэшировать / Михаил Конюхов (Perfect Solut...HDD, SSD, RAM, RAID, и кого на ком кэшировать / Михаил Конюхов (Perfect Solut...
HDD, SSD, RAM, RAID, и кого на ком кэшировать / Михаил Конюхов (Perfect Solut...Ontico
 

Viewers also liked (20)

Что нового в nginx? / Максим Дунин (Nginx, Inc.)
Что нового в nginx? / Максим Дунин (Nginx, Inc.)Что нового в nginx? / Максим Дунин (Nginx, Inc.)
Что нового в nginx? / Максим Дунин (Nginx, Inc.)
 
Remote Highload / Андрей Смирнов (Virtustream)
Remote Highload / Андрей Смирнов (Virtustream)Remote Highload / Андрей Смирнов (Virtustream)
Remote Highload / Андрей Смирнов (Virtustream)
 
HHVM: Efficient and Scalable PHP/Hack Execution / Guilherme Ottoni (Facebook)
HHVM: Efficient and Scalable PHP/Hack Execution / Guilherme Ottoni (Facebook)HHVM: Efficient and Scalable PHP/Hack Execution / Guilherme Ottoni (Facebook)
HHVM: Efficient and Scalable PHP/Hack Execution / Guilherme Ottoni (Facebook)
 
Красиво и не тормозит! Анимация без ущерба для производительности приложений ...
Красиво и не тормозит! Анимация без ущерба для производительности приложений ...Красиво и не тормозит! Анимация без ущерба для производительности приложений ...
Красиво и не тормозит! Анимация без ущерба для производительности приложений ...
 
Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...
Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...
Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...
 
Виртуальный ЦОД для корпоративных клиентов на базе Virtuozzo: стабильность, п...
Виртуальный ЦОД для корпоративных клиентов на базе Virtuozzo: стабильность, п...Виртуальный ЦОД для корпоративных клиентов на базе Virtuozzo: стабильность, п...
Виртуальный ЦОД для корпоративных клиентов на базе Virtuozzo: стабильность, п...
 
Быстрый старт iOS приложения на примере iOS Почты Mail.Ru / Николай Морев (Ma...
Быстрый старт iOS приложения на примере iOS Почты Mail.Ru / Николай Морев (Ma...Быстрый старт iOS приложения на примере iOS Почты Mail.Ru / Николай Морев (Ma...
Быстрый старт iOS приложения на примере iOS Почты Mail.Ru / Николай Морев (Ma...
 
Cautious: IPv6 is here / Александр Азимов (Qrator Labs)
Cautious: IPv6 is here / Александр Азимов (Qrator Labs)Cautious: IPv6 is here / Александр Азимов (Qrator Labs)
Cautious: IPv6 is here / Александр Азимов (Qrator Labs)
 
Пользователь точно оценит! Повышение производительности мобильных приложений ...
Пользователь точно оценит! Повышение производительности мобильных приложений ...Пользователь точно оценит! Повышение производительности мобильных приложений ...
Пользователь точно оценит! Повышение производительности мобильных приложений ...
 
Борьба с DDoS в хостинге - по обе стороны баррикад / Константин Новаковский (...
Борьба с DDoS в хостинге - по обе стороны баррикад / Константин Новаковский (...Борьба с DDoS в хостинге - по обе стороны баррикад / Константин Новаковский (...
Борьба с DDoS в хостинге - по обе стороны баррикад / Константин Новаковский (...
 
Как поддерживать и развивать пачку "похожих" проектов. Кластер или конгломера...
Как поддерживать и развивать пачку "похожих" проектов. Кластер или конгломера...Как поддерживать и развивать пачку "похожих" проектов. Кластер или конгломера...
Как поддерживать и развивать пачку "похожих" проектов. Кластер или конгломера...
 
Адаптивная оптимизация запросов в реляционных СУБД / Олег Иванов (Postgres Pr...
Адаптивная оптимизация запросов в реляционных СУБД / Олег Иванов (Postgres Pr...Адаптивная оптимизация запросов в реляционных СУБД / Олег Иванов (Postgres Pr...
Адаптивная оптимизация запросов в реляционных СУБД / Олег Иванов (Postgres Pr...
 
Эффективная отладка репликации MySQL / Света Смирнова (Percona)
Эффективная отладка репликации MySQL / Света Смирнова (Percona)Эффективная отладка репликации MySQL / Света Смирнова (Percona)
Эффективная отладка репликации MySQL / Света Смирнова (Percona)
 
Поиск совпадений и дедупликация в потоке / Леонид Юрьев (Positive Technologies)
Поиск совпадений и дедупликация в потоке / Леонид Юрьев (Positive Technologies)Поиск совпадений и дедупликация в потоке / Леонид Юрьев (Positive Technologies)
Поиск совпадений и дедупликация в потоке / Леонид Юрьев (Positive Technologies)
 
Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт...
 Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт... Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт...
Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт...
 
Как devops исчерпывает себя, и что будет дальше / Кирилл Вечера (Jetware)
Как devops исчерпывает себя, и что будет дальше / Кирилл Вечера (Jetware)Как devops исчерпывает себя, и что будет дальше / Кирилл Вечера (Jetware)
Как devops исчерпывает себя, и что будет дальше / Кирилл Вечера (Jetware)
 
Sphinx 3.0, поиск 15 лет спустя / Андрей Аксенов (Sphinx)
Sphinx 3.0, поиск 15 лет спустя / Андрей Аксенов (Sphinx)Sphinx 3.0, поиск 15 лет спустя / Андрей Аксенов (Sphinx)
Sphinx 3.0, поиск 15 лет спустя / Андрей Аксенов (Sphinx)
 
Нейронные сети на страже индустриальной кибербезопасности / Павел Филонов (Ла...
Нейронные сети на страже индустриальной кибербезопасности / Павел Филонов (Ла...Нейронные сети на страже индустриальной кибербезопасности / Павел Филонов (Ла...
Нейронные сети на страже индустриальной кибербезопасности / Павел Филонов (Ла...
 
Введение в архитектуры нейронных сетей / Григорий Сапунов (Intento)
Введение в архитектуры нейронных сетей / Григорий Сапунов (Intento)Введение в архитектуры нейронных сетей / Григорий Сапунов (Intento)
Введение в архитектуры нейронных сетей / Григорий Сапунов (Intento)
 
HDD, SSD, RAM, RAID, и кого на ком кэшировать / Михаил Конюхов (Perfect Solut...
HDD, SSD, RAM, RAID, и кого на ком кэшировать / Михаил Конюхов (Perfect Solut...HDD, SSD, RAM, RAID, и кого на ком кэшировать / Михаил Конюхов (Perfect Solut...
HDD, SSD, RAM, RAID, и кого на ком кэшировать / Михаил Конюхов (Perfect Solut...
 

Similar to Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)

SECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли UnitySECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли UnitySECON
 
Interactive Lab: Разработка Flash игр на Unity3D
Interactive Lab: Разработка Flash игр на Unity3DInteractive Lab: Разработка Flash игр на Unity3D
Interactive Lab: Разработка Flash игр на Unity3DDevGAMM Conference
 
Convert this: peculiarities of cross-platform mobile game development at Vizor
Convert this: peculiarities of cross-platform mobile game development at VizorConvert this: peculiarities of cross-platform mobile game development at Vizor
Convert this: peculiarities of cross-platform mobile game development at VizorDevGAMM Conference
 
Steel monkeys: Unity3D глазами программиста графики
Steel monkeys: Unity3D глазами программиста графикиSteel monkeys: Unity3D глазами программиста графики
Steel monkeys: Unity3D глазами программиста графикиDevGAMM Conference
 
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)Ontico
 
Андрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаАндрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаSergey Platonov
 
Многопоточность в играх. Игорь Лобанчиков. CoreHard Spring 2019
Многопоточность в играх. Игорь Лобанчиков. CoreHard Spring 2019Многопоточность в играх. Игорь Лобанчиков. CoreHard Spring 2019
Многопоточность в играх. Игорь Лобанчиков. CoreHard Spring 2019corehard_by
 
Unity_ Handmade graphics optimizations by Roman Chehowski
Unity_ Handmade graphics optimizations by Roman ChehowskiUnity_ Handmade graphics optimizations by Roman Chehowski
Unity_ Handmade graphics optimizations by Roman ChehowskiRoman Chehowski
 
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...Yandex
 
Multithreading in java past and actual
Multithreading in java past and actualMultithreading in java past and actual
Multithreading in java past and actualYevgen Levik
 
Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1m2rus
 
Сверхоптимизация кода на Python
Сверхоптимизация кода на PythonСверхоптимизация кода на Python
Сверхоптимизация кода на Pythonru_Parallels
 
Сверхоптимизация кода на Python
Сверхоптимизация кода на PythonСверхоптимизация кода на Python
Сверхоптимизация кода на PythonCodeFest
 
разработка бизнес приложений (8)
разработка бизнес приложений (8)разработка бизнес приложений (8)
разработка бизнес приложений (8)Alexander Gornik
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Platonov Sergey
 
Владимир Алаев "Разработка на Node.js: инструменты, библиотеки, сервисы"
Владимир Алаев "Разработка на Node.js: инструменты, библиотеки, сервисы"Владимир Алаев "Разработка на Node.js: инструменты, библиотеки, сервисы"
Владимир Алаев "Разработка на Node.js: инструменты, библиотеки, сервисы"Yandex
 
Архитектура в Agile: слабая связность
Архитектура в Agile: слабая связностьАрхитектура в Agile: слабая связность
Архитектура в Agile: слабая связностьAndrey Bibichev
 
Язык Ада в современной программной индустрии.
Язык Ада в современной программной индустрии.Язык Ада в современной программной индустрии.
Язык Ада в современной программной индустрии.Maxim Reznik
 

Similar to Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES) (20)

SECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли UnitySECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли Unity
 
Interactive Lab: Разработка Flash игр на Unity3D
Interactive Lab: Разработка Flash игр на Unity3DInteractive Lab: Разработка Flash игр на Unity3D
Interactive Lab: Разработка Flash игр на Unity3D
 
Convert this: peculiarities of cross-platform mobile game development at Vizor
Convert this: peculiarities of cross-platform mobile game development at VizorConvert this: peculiarities of cross-platform mobile game development at Vizor
Convert this: peculiarities of cross-platform mobile game development at Vizor
 
Steel monkeys: Unity3D глазами программиста графики
Steel monkeys: Unity3D глазами программиста графикиSteel monkeys: Unity3D глазами программиста графики
Steel monkeys: Unity3D глазами программиста графики
 
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
 
Андрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаАндрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кода
 
Многопоточность в играх. Игорь Лобанчиков. CoreHard Spring 2019
Многопоточность в играх. Игорь Лобанчиков. CoreHard Spring 2019Многопоточность в играх. Игорь Лобанчиков. CoreHard Spring 2019
Многопоточность в играх. Игорь Лобанчиков. CoreHard Spring 2019
 
Python и Cython
Python и CythonPython и Cython
Python и Cython
 
Unity_ Handmade graphics optimizations by Roman Chehowski
Unity_ Handmade graphics optimizations by Roman ChehowskiUnity_ Handmade graphics optimizations by Roman Chehowski
Unity_ Handmade graphics optimizations by Roman Chehowski
 
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
 
Async Python
Async PythonAsync Python
Async Python
 
Multithreading in java past and actual
Multithreading in java past and actualMultithreading in java past and actual
Multithreading in java past and actual
 
Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1
 
Сверхоптимизация кода на Python
Сверхоптимизация кода на PythonСверхоптимизация кода на Python
Сверхоптимизация кода на Python
 
Сверхоптимизация кода на Python
Сверхоптимизация кода на PythonСверхоптимизация кода на Python
Сверхоптимизация кода на Python
 
разработка бизнес приложений (8)
разработка бизнес приложений (8)разработка бизнес приложений (8)
разработка бизнес приложений (8)
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
 
Владимир Алаев "Разработка на Node.js: инструменты, библиотеки, сервисы"
Владимир Алаев "Разработка на Node.js: инструменты, библиотеки, сервисы"Владимир Алаев "Разработка на Node.js: инструменты, библиотеки, сервисы"
Владимир Алаев "Разработка на Node.js: инструменты, библиотеки, сервисы"
 
Архитектура в Agile: слабая связность
Архитектура в Agile: слабая связностьАрхитектура в Agile: слабая связность
Архитектура в Agile: слабая связность
 
Язык Ада в современной программной индустрии.
Язык Ада в современной программной индустрии.Язык Ада в современной программной индустрии.
Язык Ада в современной программной индустрии.
 

More from Ontico

One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...Ontico
 
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Ontico
 
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Ontico
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Ontico
 
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Ontico
 
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)Ontico
 
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Ontico
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Ontico
 
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)Ontico
 
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)Ontico
 
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Ontico
 
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Ontico
 
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Ontico
 
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Ontico
 
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)Ontico
 
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Ontico
 
Разгоняем 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
 
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...Ontico
 
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Ontico
 
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Ontico
 

More from Ontico (20)

One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
 
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
 
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
 
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
 
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
 
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
 
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
 
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
 
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
 
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
 
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
 
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
 
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
 
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
 
Разгоняем 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.)
 
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
 
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
 
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
 

Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)

  • 7. Unity3D PC & Console games Mobile games Architectural visualizations Medical simulations Military simulations CAD Research Interactive presentations … Education Media & movies Art installations
  • 8. Unity3D PC & Console games Mobile games Architectural visualizations Medical simulations Military simulations CAD Research Interactive presentations … Education Media & movies Art installations
  • 10. Суровый мир мобильных игр • Высокая конкуренция
  • 11. Суровый мир мобильных игр • Высокая конкуренция • Специфика аудитории
  • 12. Суровый мир мобильных игр • Высокая конкуренция • Специфика аудитории • Специфика программно-аппаратной платформы
  • 13. Что там внутри? • Какой-то странный процессор • ARM, x86, MIPS… 32 и 64 bit.
  • 14. • Какой-то странный процессор • ARM, x86, MIPS… 32 и 64 bit. Что там внутри? ≠
  • 15. Что там внутри? • Какая-то батарейка
  • 16. Что там внутри? • Какой-то графический ускоритель ≠
  • 17. Что там внутри? • Какая-то оперативная память • Её всегда мало
  • 19. Зоопарк устройств 240 MB ought to be enough for anyone – Gill Bates
  • 20. • Падение FPS. • Чёрные квадраты вместо текстур. • «Тихое» завершение приложения без отчёта об ошибке. Зоопарк устройств >240 MB
  • 21. Главный совет “Make optimization a design consideration, not a final step” - Unity Docs
  • 22. Главный совет “Make optimization a design consideration, not a final step” - Unity Docs Постоянно спрашивай себя: “А не ерунду ли я сейчас делаю?” - Примерный перевод
  • 23. Из-за чего всё тормозит?
  • 24. Из-за чего всё тормозит? • Код
  • 25. Из-за чего всё тормозит? • Код • Ресурсы
  • 28. Импорт ресурсов: звук 16 bit * 44100 Hz * 2 channels = 176.4 KB/s
  • 29. Импорт ресурсов: звук 16 bit * 44100 Hz * 2 channels = 176.4 KB/s
  • 30. Импорт ресурсов: звук • Сжатие MP3 на iOS • Сжатие Vorbis на Android • Force Mono • Низкий битрейт (насколько возможно) ≠
  • 32. Импорт ресурсов: анимации • Сложные анимации занимают много памяти. KISS.
  • 33. Импорт ресурсов: анимации • Сложные анимации занимают много памяти. KISS. • Анимация большого числа объектов нагружает ЦП.
  • 34. Импорт ресурсов: анимации • Сложные анимации занимают много памяти. KISS. • Анимация большого числа объектов нагружает ЦП. • Можно уменьшить количество объектов.
  • 35. Импорт ресурсов: анимации • Сложные анимации занимают много памяти. KISS. • Анимация большого числа объектов нагружает ЦП. • Можно уменьшить количество объектов. • Можно упростить объекты. ?!
  • 36. Импорт ресурсов: 3D-модели • Отключите Read/Write. • Много полигонов = много памяти. • Optimize Mesh Data.
  • 37. Импорт ресурсов: 3D-модели Точно ли это всё понадобится?
  • 38. Импорт ресурсов: текстуры • Сжатие обязательно Android: ETC iOS: PVRTC
  • 39. Импорт ресурсов: текстуры RGB ETC 4 bit, 1024х1024: 512KB RGBA 32 bit, 1024х1024: 4MB Alpha ETC 4 bit, 512x512: 128KB -84%
  • 40. Импорт ресурсов: текстуры RGB ETC 4 bit, 1024х1024: 512KB RGBA 32 bit, 1024х512: 2MB Alpha ETC 4 bit, 512x512: 128KB -69%
  • 41. • Не включайте Read/Write. • Отключите mipmaps, если возможно. • Не используйте огромные текстуры. • 2048x2048 или 1024x1024 для UI • 512x512 или меньше для текстур моделей Импорт ресурсов: текстуры *Допустимо, если есть запас производительности GPU -50% -33%*
  • 43. Борьба с overdraw High-res background parts Lower-res RenderTexture High-DPI Device
  • 44. Борьба с overdraw High-res background parts Lower-res RenderTexture High-DPI Device Можно переиспользовать, если камера не движется
  • 45. Борьба с overdraw Нагрузка на GPU ниже, когда камера статична
  • 47. Код и runtime C# code JS code UnityScript code CIL CIL CIL Assembly.dll Sources Script compiler Mono runtime JIT AOT
  • 48. Код и runtime C# code JS code UnityScript code CIL CIL CIL Assembly.dll Sources Script compiler Mono runtime JIT AOT
  • 49. Код и runtime • Сборка мусора работает плохо. • Heap удваивается при достижении лимита. И не уменьшается никогда. • Производительность игры со временем снижается.
  • 50. Код и runtime: Garbage collection ReferenceType class Entry { uint id; long phone; string name; } Thread stack (FAST) var e1 = new Entry(); var e2 = e1; Managed heap (SLOW) ref1 Entry id: 1337 phone: 88005553535 name: ref2 String value: “Ayy Lmao” ref3
  • 51. Код и runtime: Garbage collection ValueType struct Entry { uint id; long phone; string name; } Thread stack (FAST) var e1 = new Entry(); var e2 = e1; Managed heap (SLOW) Entry id: 1337 phone: 88005553535 name: ref1 String value: “Ayy Lmao” Entry (сopy) id: 740 phone: 88005553535 name: ref2e2.id = 740;
  • 52. Код и runtime: аллокации • ValueType вместо ReferenceType, где уместно.
  • 53. Код и runtime: аллокации • ValueType вместо ReferenceType, где уместно. • Меньше временных объектов, аллоцируй однажды и переиспользуй.
  • 54. Код и runtime: аллокации Refactor public static class Modifiers { public List<Modifier> GetAll() { var tmp = new List<Modifier>(); FillStuff(tmp); return tmp; } } public static class Modifiers { public void GetAll(List<Modifier> to_fill) { to_fill.Clear(); FillStuff(to_fill); } } public void Update() { List<Modifier> modifiers = Modifiers.GetAll(); DisplayModifiers(modifiers); } List<Modifier> = new List<Modifier>(CAPACITY); public void Update() { Modifiers.GetAll(modifiers); DisplayModifiers(modifiers); }
  • 55. Код и runtime: аллокации • ValueType вместо ReferenceType, где уместно. • Меньше временных объектов, аллоцируй однажды и переиспользуй. • «Гибридные» контейнеры.
  • 56. Код и runtime: аллокации struct HList<T> : IList<T> гибридный контейнер T val0; T val1; T val2; T val3; List<T> fallback; T TT ... myHList.Add(newVal); Count > Capacity? True, alloc fallback once False, no allocs
  • 57. Код и runtime: неявные аллокации • Regex;
  • 58. Код и runtime: неявные аллокации • Regex; • “Excessive” + “ strings “ + “concat”;
  • 59. Код и runtime: неявные аллокации • Regex; • “Excessive” + “ strings “ + “concat”; • Closures & anon methods; public void LoginWithID(int id) { if(IsLoggedIn()) return; LoginWithDelegate( delegate() { ProcessNewID(id); } ); } Вы ещё здесь… … а эти объекты уже созданы в heap. “id” используется в closure, копия создаётся в heap.
  • 60. Код и runtime: неявные аллокации • Regex; • “Excessive” + “ strings “ + “concat”; • Closures & anon methods; • LINQ;
  • 61. Код и runtime: неявные аллокации • Regex; • “Excessive” + “ strings “ + “concat”; • Closures & anon methods; • LINQ; • foreach;
  • 62. Код и runtime: неявные аллокации • Regex; • “Excessive” + “ strings “ + “concat”; • Closures & anon methods; • LINQ; • foreach; • using;
  • 63. Код и runtime: неявные аллокации • Regex; • “Excessive” + “ strings “ + “concat”; • Closures & anon methods; • LINQ; • foreach; • using; • Array.IndexOf и т.п.; • …
  • 64. Код и runtime: boxing struct Entry : IPrintable Thread stack var e1 = new Entry(); Entry Managed heapvoid MyPrint(IPrintable p) Object (boxed Entry) IPrintable toPrint = e1; MyPrint(toPrint); IPrintable ref1 Неявная аллокация
  • 65. Код и runtime: аллокации Unity API SkinnedMeshRenderer smr = ...; for(int i = 0; i < smr.bones.Length; i++) { //... Do stuff } SkinnedMeshRenderer smr = ...; var bones = smr.bones; for(int i = 0; i < bones.Length; i++) { //... Do stuff }
  • 66. Код и runtime: аллокации Unity API SkinnedMeshRenderer smr = ...; for(int i = 0; i < smr.bones.Length; i++) { //... Do stuff } SkinnedMeshRenderer smr = ...; var bones = smr.bones; for(int i = 0; i < bones.Length; i++) { //... Do stuff } Аллоцирует массив “bones” bones.Length раз Аллоцирует массив “bones” 1 раз
  • 67. Код и runtime: аллокации Unity API • Если Unity API возвращает массив, будет создана новая копия.
  • 68. Код и runtime: аллокации Unity API • Если Unity API возвращает массив, будет создана новая копия. • Каждый раз.
  • 69. Код и runtime: аллокации Unity API • Если Unity API возвращает массив, будет создана новая копия. • Каждый раз. • Даже если значение не изменилось.
  • 70. Код и runtime: аллокации Unity API • Если Unity API возвращает массив, будет создана новая копия. • Каждый раз. • Даже если значение не изменилось. • Даже если это выглядит как безобидный getter.
  • 71. Код и runtime: аллокации Unity API • Если Unity API возвращает массив, будет создана новая копия. • Каждый раз. • Даже если значение не изменилось. • Даже если это выглядит как безобидный getter. • «Безобидный getter» может скрывать внутри тяжёлые вычисления. public string name { get { return BadWordsFilter.ReplaceAll(data.name.Unescape()); } }
  • 72. Код и runtime: прочее • No inlining. • Вызов метода С# = вызов в машинном коде. • Property accessors = вызов метода. • Это сказывается на скорости интенсивных вычислений. • Do inlining yourself.
  • 73. Код и runtime: прочее • К свойствам некоторых компонентов можно обращаться по имени (Animator, Shader, Material). • Внутри имя каждый раз преобразовывается в хэш. • Вычисли хэш однажды и переиспользуй. material.SetColor(“_Color”, Color.white); animator.SetTrigger(“attack”); static readonly int HASH_MAT_COLOR = Shader.PropertyToID(“_Color”); static readonly int HASH_ANIM_ATTACK = Animator.StringToHash(“attack”); material.SetColor(HASH_MAT_COLOR, Color.white); animator.SetTrigger(HASH_ANIM_ATTACK);
  • 74. Код и runtime: прочее • Reflection is slow. • Text parsing is slow. • Text parsers based on Reflection are super slow.
  • 82. Summary • Специфика мобильных платформ должна учитываться на всех этапах разработки.
  • 83. Summary • Специфика мобильных платформ должна учитываться на всех этапах разработки. • Экономить RAM не менее важно, чем ресурс CPU и GPU.
  • 84. Summary • Специфика мобильных платформ должна учитываться на всех этапах разработки. • Экономить RAM не менее важно, чем ресурс CPU и GPU. • Разумный компромисс «Качество vs. Память» для ассетов, сжатие.
  • 85. Summary • Специфика мобильных платформ должна учитываться на всех этапах разработки. • Экономить RAM не менее важно, чем ресурс CPU и GPU. • Разумный компромисс «Качество vs. Память» для ассетов, сжатие. • Избегай overdraw.
  • 86. Summary • Специфика мобильных платформ должна учитываться на всех этапах разработки. • Экономить RAM не менее важно, чем ресурс CPU и GPU. • Разумный компромисс «Качество vs. Память» для ассетов, сжатие. • Избегай overdraw. • Избегай аллокаций и boxing’а.
  • 87. Summary • Специфика мобильных платформ должна учитываться на всех этапах разработки. • Экономить RAM не менее важно, чем ресурс CPU и GPU. • Разумный компромисс «Качество vs. Память» для ассетов, сжатие. • Избегай overdraw. • Избегай аллокаций и boxing’а. • Помни особенности Unity Mono Runtime. («heap never shrinks»)
  • 88. Summary • Специфика мобильных платформ должна учитываться на всех этапах разработки. • Экономить RAM не менее важно, чем ресурс CPU и GPU. • Разумный компромисс «Качество vs. Память» для ассетов, сжатие. • Избегай overdraw. • Избегай аллокаций и boxing’а. • Помни особенности Unity Mono Runtime. («heap never shrinks») • Помни особенности Unity API. («no inlining», «arrays always allocated»)
  • 89. Summary • Специфика мобильных платформ должна учитываться на всех этапах разработки. • Экономить RAM не менее важно, чем ресурс CPU и GPU. • Разумный компромисс «Качество vs. Память» для ассетов, сжатие. • Избегай overdraw. • Избегай аллокаций и boxing’а. • Помни особенности Unity Mono Runtime. («heap never shrinks») • Помни особенности Unity API. («no inlining», «arrays always allocated») • Профайлить надо. Часто. Через Instruments.