SlideShare a Scribd company logo
1 of 66
Грабли Unity3D
Алексей Чубарь
BIT.GAMES (Пенза)
на примере Гильдии Героев
О чём речь?
1. Почему Unity3D?
2. Влияние движка на пайплайн разработки.
3. Неожиданные технические проблемы и их решения.
4. Удобство Unity3D для подобных проектов.
О чём речь?
1. Почему Unity3D?
2. Влияние движка на пайплайн разработки.
3. Неожиданные технические проблемы и их решения.
4. Удобство Unity3D для подобных проектов.
Brace yourselves
Technical mumbo-jumbo is coming
Предпосылки перехода: жизнь до
Web-browsers
Flash/Action Script
контент
iOS, Android
OpenGL ES/C++
Предпосылки перехода: RPG ≠ Золушка
• Срочно нужен прототип
• 2D не катит
• Нужны инструменты
для создания контента
Почему Unity?
Почему Unity?
Почему Unity?
Почему Unity?
Почему Unity?
Почему Unity?
Почему Unity?
Почему Unity?
Почему Unity?
Формат хранения данных
Формат хранения данных
Формат хранения данных
Портирование с С++
• Семантика сохраняется, меняются только элементы синтаксиса.
• Кодовая база C++ не пропадает даром.
Расширяемость и препроцессинг
• Утилита командной строки обрабатывает ассеты перед сборкой.
• В редакторе обработка запускается из кастомного пункта меню.
Расширяемость и всё остальное
Расширения редактора могут быть
любой сложности и назначения.
У нас используются для:
● препроцессинга ассетов
● пакетной обработки графики
● отладки геймплея
● самых разных читов
● упрощения редактирования
● сборки DLC
● ...
Скриптуемость - это...
автоматизация сборки релизов.
● Выше скорость.
● Ниже влияние человеческого фактора.
Скриптуемость - это...
автоматизация функционального
тестирования.
● Быстро.
● Дотошно.
● Не просит зарплату.
Плагины и Asset Store
• Проверенные решения многих задач.
• Недорого/бесплатно.
• Легко интегрировать.
• О чём ещё мечтать?
Плагины и Asset Store: функциональность
Возможности
кроссплатформенног
о плагина
Требуемый функционал
Часть нужного
функционала недоступна
Плагины и Asset Store: настройка
Плагинам иногда требуется внести
изменения в конфигурацию приложения.
Они могут делать это автоматически и
удалять другие важные изменения.
Следите за ними и отдавайте
предпочтение ручной настройке.
1.
2.
3.
Плагины и Asset Store: настройка
Изменения в конфигурацию приложения
могут вноситься и на этапе сборки.
Редактор поочерёдно запускает все скрипты
Editor/PostProcessBuildPlayer*.
Затем вызывает все методы с атрибутом
PostProcessBuild (PostProcessBuildAttribute) в
порядке, указанном в скобках.
Изучите эти скрипты и методы, если
конфигурация внезапно поломалась.
Плагины и Asset Store: настройка
Чтобы результат выполнения
скрипта никто не попортил,
запускайте его последним
Ваш скрипт
Запредельный
порядок выполнения
Плагины и Asset Store: настройка
Некоторые плагины имеют
взаимоисключающие требования.
Решение - препроцессинг
конфигурационных файлов при
сборке под конкретную платформу.
Плагины и Asset Store: ограничения Android
UserProfile.java
MainActivity.java
economics.jar
.class
.class
classes.dex classes.dex
Game.apk
N
methods
M
methods
K
methods
S = N + M + K + ...
● S < 63000: OK.
● S > 65536: Ошибка сборки APK в Unity.
● 63000 < S <= 65536: FFFFUUUUU~!!
Плагины и Asset Store: ограничения Android
Выпилить лишние SDK:
+ Максимально просто
- Эффективно “до следующего раза”
- Лишние? Мне всё нужно!
Выпиливать SDK в зависимости от
платформы:
• Относительно просто
• Относительно эффективно
- Легко облажаться
Multidex:
+ Решит проблему, сохранив SDK
- Экспорт проекта Android Studio
- Лишнее остаётся в APK
ProGuard:
+ Максимально эффективно
- Экспорт проекта Android Studio
- Требует настройки
Плагины и Asset Store: поддержка
В плагинах нередки баги.
Поддержка и фиксы остаются на
совести автора плагина.
Фиксить баги самому мешает
закрытый исходный код.
Сообщество пользователей, как
правило, невелико.
Редактор: стабильность и производительность
Редактор иногда падает. В новых
версиях реже.
Иморт/экспорт ассетов в один поток -
долго. Облегчат жизнь:
• SSD
• Ramdisk
• Десятки тысяч долларов на
крутую билд-машину
Редактор: MonoDevelop
• Долго перезагружает проект после внешних изменений.
• Иногда портит отступы в коде.
• Дебаггер не всегда подключается.
• Отладочная информация не всегда релевантна.
Не повод отказываться от любимого текстового редактора,
но может быть полезна для отладки в ряде случаев.
Редактор: threading
• Симуляция игры происходит в UI thread редактора.
• Ошибка в скрипте может “повесить” Unity.
• Запуск на устройстве даст больше информации о причине зависания.
• Panic Button plugin прервёт любой скрипт в редакторе.
Редактор: конфликты версий
Если работать над проектом в
разных версиях Unity, некоторые
файлы спонтанно меняются.
Это ведёт к конфликтам при
слиянии.
Держите всех на одной версии
редактора.
Редактор: экспорт DLC
level1.prefab
level2.prefab
level3.prefab
levels.unity3d 0x101B00B5DLC build #1
Контент не
изменяется
Client build
Game client
Ожидает
0x101B00B5
levels.unity3d 0xDEADBEEF
DLC build #2
built-in hash:
Редактор: подгрузка изменений
Если игра запущена в редакторе, любое изменение кода её сломает
¯_(ツ)_/¯
Workaround: 1 файл = 1 MonoBehavior
Компилятор и runtime
Компилятор и runtime: Garbage collection
• Сборка мусора работает плохо.
• Производительность игры со временем снижается.
• “Ручного управления” освобождением памяти нет.
Компилятор и runtime: Garbage collection
ReferenceType
class Entry {
uint id;
long phone;
string name;
}
Thread stack
var e1 = new Entry();
var e2 = e1;
Managed heap
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
var e1 = new Entry();
var e2 = e1;
Managed heap
Entry
id: 1337
phone: 88005553535
name: ref1
String
value: “Ayy Lmao”
Entry (сopy)
id: 740
phone: 88005553535
name: ref2
e2.id = 740;
Компилятор и runtime: Garbage collection
Нужно снижать число аллокаций:
• меньше временных объектов, аллоцируй
однажды и переиспользуй;
• ValueType вместо ReferenceType, где уместно;
• гибридные контейнеры. refactor
Компилятор и runtime: Garbage collection
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: Garbage collection
Встроенные возможности языка много
аллоцируют. Зона риска:
• foreach;
• using;
• Array.IndexOf и т.п.;
• “Excessive” + “ strings “ + “concat”;
• …
• твоя киска
Можно придумать неаллоцирующие замены.
Компилятор и runtime: Garbage collection
Boxing
здорового человека
Boxing C#-программиста
struct Entry : IPrintable
Thread stack
var e1 = new Entry();
Entry
Managed heap
void MyCustomPrint(IPrintable p)
Object (boxed Entry)
IPrintable toPrint = e1;
MyCustomPrint(toPrint); IPrintable ref1
Неявная аллокация
Компилятор и runtime: повреждение стека
При передаче крупных структур по
значению возможно повреждение
стека.
Закономерность не установлена.
Решение - передавать их по
ссылке.
Unity call stack be like:
i == 2 i == 2 i == 2 i == -97
Компилятор и runtime: креши UnityPlayer
WindZone + UnloadUnusedAssets() =
падение самого UnityPlayer на iOS.
Соотнести причину со следствием
было очень сложно.
Пришлось отказаться от WindZone.
UnityPlayer? More like UnityPrayer!
Компилятор и runtime: JIT и AOT
C# code
JS code
UnityScript
code
CIL
CIL
CIL
Assembly.dll
Sources Script compiler Mono runtime
JIT
AOT
Компилятор и runtime: JIT и AOT
C# code
JS code
UnityScript
code
CIL
CIL
CIL
Assembly.dll
Sources Script compiler Mono runtime
JIT
AOT
Компилятор и runtime: жизнь без JIT на iOS
Весь код должен быть виден и понятен среде выполнения при запуске:
• Generics + Reflection = butthurt;
• Generics + Native code = butthurt;
• Delegates + Native code = butthurt;
...
Страница “Troubleshooting on iOS devices” - ваш друг и помощник.
Компилятор и runtime: жизнь без JIT на iOS
C#
JS
US
CIL
CIL
CIL
Sources Script compiler Mono runtime
JIT
AOT
dlldll
C++ Native binary
scripting backend: Mono
scripting backend: IL2CPP
Попытка использовать
JIT ведёт к
ExecutionEngineException
При попытке
использовать JIT не
происходит НИЧЕГО
DLL, собранные другим
компилятором, не знают,
что JIT недоступен
Компилятор и runtime: жизнь без JIT на iOS
• “Chat ConnectAsync…” выводится
• “Chat Connecting…” - нет.
Диагностика:
• Переключить Scripting backend на Mono
и словить ExecutionEngineException.
Решения:
• Использовать исходники вместо DLL.
• Собрать DLL компилятором Unity.
Компилятор и runtime: жизнь без JIT на iOS
Workaround для проблемы с DLL:
• объявлять операции
add/remove у event явно.
+ Все компиляторы будут
генерить одинаковый байткод.
- Код становится менее
компактным.
- Про это каждый раз надо
помнить.
Оптимизация графики
Оптимизация графики: сжатие текстур
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%
Оптимизация графики: fillrate
High-res
background parts
Lower-res
RenderTexture
High-DPI Device
Оптимизация графики: fillrate
High-res
background parts
Lower-res
RenderTexture
High-DPI Device
Можно переиспользовать,
если камера не движется
Оптимизация графики: fillrate
Нагрузка на GPU ниже,
когда камера статична
Зона видимых объектов
Оптимизация графики: depth buffer
Far Clip Plane
Near Clip Plane
Здесь ничего
не рендерится
Здесь ничего
не рендерится
Оптимизация графики: depth buffer
Слишком широкий диапазон,
низкая точность.
Разрядность буфера зависит
от GPU, на ряде устройств
появляется Z-fighting.
OK!
Слишком узкий
диапазон, отсекается
больше, чем нужно
Сообщество
Сообщество: Unity Answers
• Огромная численность.
• Преобладание начинающих
разработчиков.
• Много странных вопросов.
• Много ответов на простые
вопросы.
• Мало ответов на сложные
вопросы.
2006: 2016:
The impact of Unity Answers
Сообщество: участие Unity Technologies
• Движок активно поддерживается.
• Сообщество активно обсуждает релизы и использует issue tracker.
• Представители Unity Technologies принимают участие в обсуждениях.
• Графон всё лучше.
• Развиваются веб-сервисы для Pro-пользователей (аналитика, crash
reporting).
TL;DR: Unity норм
• Unity - это внушительный набор средств для разработки.
• Бинарные ассеты - отстой, храните больше в текстовом виде.
• Скриптуемость и расширяемость редактора - это очень круто.
• There’s a [bad] plugin for that.
• Отлаживать код не всегда удобно, используйте логи.
• Аллокации - зло.
• Желательно понимать, что там под капотом.
• Учитывайте специфику мобильных устройств при оптимизации.
• На сообщество надейся, а сам не плошай.
Несмотря на подводные камни, достоинства перевешивают недостатки.
Спасибо за внимание
Вопросы?

More Related Content

What's hot

Java compilers and IDEs
Java compilers and IDEsJava compilers and IDEs
Java compilers and IDEs
chashnikov
 
DUMP-2013 Serverside - Внутренняя кухня JIT компилятора - Старовойт Андрей
DUMP-2013 Serverside - Внутренняя кухня JIT компилятора - Старовойт АндрейDUMP-2013 Serverside - Внутренняя кухня JIT компилятора - Старовойт Андрей
DUMP-2013 Serverside - Внутренняя кухня JIT компилятора - Старовойт Андрей
it-people
 
CodeFest 2014. Коновалов А., Шкурко Д. — Разработка и оптимизация приложений ...
CodeFest 2014. Коновалов А., Шкурко Д. — Разработка и оптимизация приложений ...CodeFest 2014. Коновалов А., Шкурко Д. — Разработка и оптимизация приложений ...
CodeFest 2014. Коновалов А., Шкурко Д. — Разработка и оптимизация приложений ...
CodeFest
 
Опыт использования Erlang в разработке многопользовательской игры
Опыт использования Erlang в разработке многопользовательской игрыОпыт использования Erlang в разработке многопользовательской игры
Опыт использования Erlang в разработке многопользовательской игры
Yuri Zhloba
 

What's hot (20)

Как не подавиться большим старым проектом. Юрий Минаев ➠ CoreHard Autumn 2019
Как не подавиться большим старым проектом. Юрий Минаев ➠  CoreHard Autumn 2019Как не подавиться большим старым проектом. Юрий Минаев ➠  CoreHard Autumn 2019
Как не подавиться большим старым проектом. Юрий Минаев ➠ CoreHard Autumn 2019
 
Андрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаАндрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кода
 
JVM: краткий курс общей анатомии, JPoint 2016 Conference Edition
JVM: краткий курс общей анатомии, JPoint 2016 Conference EditionJVM: краткий курс общей анатомии, JPoint 2016 Conference Edition
JVM: краткий курс общей анатомии, JPoint 2016 Conference Edition
 
Scala performance под капотом
Scala performance под капотомScala performance под капотом
Scala performance под капотом
 
Java compilers and IDEs
Java compilers and IDEsJava compilers and IDEs
Java compilers and IDEs
 
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
 
Поддержка Java 8 в Excelsior JET
Поддержка Java 8 в Excelsior JET Поддержка Java 8 в Excelsior JET
Поддержка Java 8 в Excelsior JET
 
"Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)
"Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)"Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)
"Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)
 
Разработка сетевых приложений с gevent
Разработка сетевых приложений с geventРазработка сетевых приложений с gevent
Разработка сетевых приложений с gevent
 
Aterdux Entertainment: Собственный движок как способ экономной и эффективной...
 Aterdux Entertainment: Собственный движок как способ экономной и эффективной... Aterdux Entertainment: Собственный движок как способ экономной и эффективной...
Aterdux Entertainment: Собственный движок как способ экономной и эффективной...
 
Java 8 Support at the JVM Level
Java 8 Support at the JVM LevelJava 8 Support at the JVM Level
Java 8 Support at the JVM Level
 
DUMP-2013 Serverside - Внутренняя кухня JIT компилятора - Старовойт Андрей
DUMP-2013 Serverside - Внутренняя кухня JIT компилятора - Старовойт АндрейDUMP-2013 Serverside - Внутренняя кухня JIT компилятора - Старовойт Андрей
DUMP-2013 Serverside - Внутренняя кухня JIT компилятора - Старовойт Андрей
 
Java 9 Модули. Почему не OSGi?
Java 9 Модули. Почему не OSGi?Java 9 Модули. Почему не OSGi?
Java 9 Модули. Почему не OSGi?
 
Модель акторов и C++ что, зачем и как?
Модель акторов и C++ что, зачем и как?Модель акторов и C++ что, зачем и как?
Модель акторов и C++ что, зачем и как?
 
CodeFest 2014. Коновалов А., Шкурко Д. — Разработка и оптимизация приложений ...
CodeFest 2014. Коновалов А., Шкурко Д. — Разработка и оптимизация приложений ...CodeFest 2014. Коновалов А., Шкурко Д. — Разработка и оптимизация приложений ...
CodeFest 2014. Коновалов А., Шкурко Д. — Разработка и оптимизация приложений ...
 
DevOps-трансформация Альфа-Банка / Антон Исанин (Альфа-Банк)
DevOps-трансформация Альфа-Банка / Антон Исанин (Альфа-Банк)DevOps-трансформация Альфа-Банка / Антон Исанин (Альфа-Банк)
DevOps-трансформация Альфа-Банка / Антон Исанин (Альфа-Банк)
 
Опыт использования Erlang в разработке многопользовательской игры
Опыт использования Erlang в разработке многопользовательской игрыОпыт использования Erlang в разработке многопользовательской игры
Опыт использования Erlang в разработке многопользовательской игры
 
DevOps guide for awesome quality assurance
DevOps guide for awesome quality assuranceDevOps guide for awesome quality assurance
DevOps guide for awesome quality assurance
 
Статический анализ кода: борьба с удорожанием ошибок
Статический анализ кода: борьба с удорожанием ошибокСтатический анализ кода: борьба с удорожанием ошибок
Статический анализ кода: борьба с удорожанием ошибок
 
JPHP - О проекте на простом языке
JPHP - О проекте на простом языкеJPHP - О проекте на простом языке
JPHP - О проекте на простом языке
 

Viewers also liked

Viewers also liked (20)

SECON'2016. Александр Шитиков, Кузнецов Максим, Кроссплатформенная разработка...
SECON'2016. Александр Шитиков, Кузнецов Максим, Кроссплатформенная разработка...SECON'2016. Александр Шитиков, Кузнецов Максим, Кроссплатформенная разработка...
SECON'2016. Александр Шитиков, Кузнецов Максим, Кроссплатформенная разработка...
 
SECON'2016. Васильков Василий, Серверное программирование сегодня
SECON'2016. Васильков Василий, Серверное программирование сегодняSECON'2016. Васильков Василий, Серверное программирование сегодня
SECON'2016. Васильков Василий, Серверное программирование сегодня
 
SECON'2016. Кардава Звиад, Концепция Physical web. Eddystone format. Google b...
SECON'2016. Кардава Звиад, Концепция Physical web. Eddystone format. Google b...SECON'2016. Кардава Звиад, Концепция Physical web. Eddystone format. Google b...
SECON'2016. Кардава Звиад, Концепция Physical web. Eddystone format. Google b...
 
SECON'2016. Бочкарев Игорь, Реактивные мобильные приложения
SECON'2016. Бочкарев Игорь, Реактивные мобильные приложенияSECON'2016. Бочкарев Игорь, Реактивные мобильные приложения
SECON'2016. Бочкарев Игорь, Реактивные мобильные приложения
 
SECON'2016. Парамонов Сергей, Автоматизируй это! Как не погрязнуть в рутине п...
SECON'2016. Парамонов Сергей, Автоматизируй это! Как не погрязнуть в рутине п...SECON'2016. Парамонов Сергей, Автоматизируй это! Как не погрязнуть в рутине п...
SECON'2016. Парамонов Сергей, Автоматизируй это! Как не погрязнуть в рутине п...
 
SECON'2016. Пименов Алексей, Как не выстрелить себе в ногу внедряя KPI
SECON'2016. Пименов Алексей, Как не выстрелить себе в ногу внедряя KPISECON'2016. Пименов Алексей, Как не выстрелить себе в ногу внедряя KPI
SECON'2016. Пименов Алексей, Как не выстрелить себе в ногу внедряя KPI
 
SECON'2016. Панин Сергей, Лебедев Андрей, Храмушин Дмитрий, IT-инфраструктура...
SECON'2016. Панин Сергей, Лебедев Андрей, Храмушин Дмитрий, IT-инфраструктура...SECON'2016. Панин Сергей, Лебедев Андрей, Храмушин Дмитрий, IT-инфраструктура...
SECON'2016. Панин Сергей, Лебедев Андрей, Храмушин Дмитрий, IT-инфраструктура...
 
SECON'2016. Приходько Артём, Модульное JavaScript приложение
SECON'2016. Приходько Артём, Модульное JavaScript приложениеSECON'2016. Приходько Артём, Модульное JavaScript приложение
SECON'2016. Приходько Артём, Модульное JavaScript приложение
 
SECON'2016. Бушмелев Юрий, Два титановых шарика
SECON'2016. Бушмелев Юрий, Два титановых шарикаSECON'2016. Бушмелев Юрий, Два титановых шарика
SECON'2016. Бушмелев Юрий, Два титановых шарика
 
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только одинSECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
 
Смирнов Александр, Security in Android Application
Смирнов Александр, Security in Android ApplicationСмирнов Александр, Security in Android Application
Смирнов Александр, Security in Android Application
 
SECON'2016. Тарасенко Анна, Принцип YAGNI в управлении проектами
SECON'2016. Тарасенко Анна, Принцип YAGNI в управлении проектамиSECON'2016. Тарасенко Анна, Принцип YAGNI в управлении проектами
SECON'2016. Тарасенко Анна, Принцип YAGNI в управлении проектами
 
SECON'2016. Лексунин Евгений, Как не запутаться в веб-разработке
SECON'2016. Лексунин Евгений, Как не запутаться в веб-разработкеSECON'2016. Лексунин Евгений, Как не запутаться в веб-разработке
SECON'2016. Лексунин Евгений, Как не запутаться в веб-разработке
 
SECON'2016. Тюменцев Евгений, Разработка надежных параллельных, распределенны...
SECON'2016. Тюменцев Евгений, Разработка надежных параллельных, распределенны...SECON'2016. Тюменцев Евгений, Разработка надежных параллельных, распределенны...
SECON'2016. Тюменцев Евгений, Разработка надежных параллельных, распределенны...
 
SECON'2016. Трошин Алексей, От 1 до 100: особенности выстраивания процессов в...
SECON'2016. Трошин Алексей, От 1 до 100: особенности выстраивания процессов в...SECON'2016. Трошин Алексей, От 1 до 100: особенности выстраивания процессов в...
SECON'2016. Трошин Алексей, От 1 до 100: особенности выстраивания процессов в...
 
SECON'2016. Ефимов Максим, JMM в Android
SECON'2016.  Ефимов Максим, JMM в AndroidSECON'2016.  Ефимов Максим, JMM в Android
SECON'2016. Ефимов Максим, JMM в Android
 
SECON'2016. Барсуков Александр, Боссами не рождаются
SECON'2016. Барсуков Александр, Боссами не рождаютсяSECON'2016. Барсуков Александр, Боссами не рождаются
SECON'2016. Барсуков Александр, Боссами не рождаются
 
SECON'2016. Кириллов Александр, Continuous Integration под микроскопом
SECON'2016. Кириллов Александр, Continuous Integration под микроскопомSECON'2016. Кириллов Александр, Continuous Integration под микроскопом
SECON'2016. Кириллов Александр, Continuous Integration под микроскопом
 
SECON'2016. Съедугин Андрей, Сказ о том, как идеальный программист с идеальны...
SECON'2016. Съедугин Андрей, Сказ о том, как идеальный программист с идеальны...SECON'2016. Съедугин Андрей, Сказ о том, как идеальный программист с идеальны...
SECON'2016. Съедугин Андрей, Сказ о том, как идеальный программист с идеальны...
 
SECON'2016. Мухаметов Андрей, RxSwift && Apple TV - так ли хорошо всё новое?
SECON'2016. Мухаметов Андрей, RxSwift && Apple TV - так ли хорошо всё новое?SECON'2016. Мухаметов Андрей, RxSwift && Apple TV - так ли хорошо всё новое?
SECON'2016. Мухаметов Андрей, RxSwift && Apple TV - так ли хорошо всё новое?
 

Similar to SECON'2016. Чубарь Алексей, Мобильные грабли Unity

Similar to SECON'2016. Чубарь Алексей, Мобильные грабли Unity (20)

Interactive Lab: Разработка Flash игр на Unity3D
Interactive Lab: Разработка Flash игр на Unity3DInteractive Lab: Разработка Flash игр на Unity3D
Interactive Lab: Разработка Flash игр на Unity3D
 
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)
 
Юрий Василевский "Автоматизация в XCode"
Юрий Василевский "Автоматизация в XCode"Юрий Василевский "Автоматизация в XCode"
Юрий Василевский "Автоматизация в XCode"
 
Юрий Василевский «Автоматизация в XCode»
Юрий Василевский «Автоматизация в XCode»Юрий Василевский «Автоматизация в XCode»
Юрий Василевский «Автоматизация в XCode»
 
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 ...
 
Unity: WebGL и IL2CPP — будущее скриптинга в Unity»
Unity: WebGL и IL2CPP — будущее скриптинга в Unity»Unity: WebGL и IL2CPP — будущее скриптинга в Unity»
Unity: WebGL и IL2CPP — будущее скриптинга в Unity»
 
Андрей Сибирёв "Ваше собственное облако — война за независимость"
Андрей Сибирёв "Ваше собственное облако — война за независимость"Андрей Сибирёв "Ваше собственное облако — война за независимость"
Андрей Сибирёв "Ваше собственное облако — война за независимость"
 
Wargaming.net: Архитектура современных 3D движков
Wargaming.net: Архитектура современных 3D движковWargaming.net: Архитектура современных 3D движков
Wargaming.net: Архитектура современных 3D движков
 
Alexey Savchenko, Evangelist, Unreal Engine/ Epic Games
Alexey Savchenko, Evangelist, Unreal Engine/ Epic GamesAlexey Savchenko, Evangelist, Unreal Engine/ Epic Games
Alexey Savchenko, Evangelist, Unreal Engine/ Epic Games
 
Масштабируемая архитектура фронтенда
Масштабируемая архитектура фронтендаМасштабируемая архитектура фронтенда
Масштабируемая архитектура фронтенда
 
“Tips&Tricks&Antitricks with .Net Core backend in GameDev”
“Tips&Tricks&Antitricks with .Net Core backend in GameDev”“Tips&Tricks&Antitricks with .Net Core backend in GameDev”
“Tips&Tricks&Antitricks with .Net Core backend in GameDev”
 
Опыт тестирования API САПР платформы
Опыт тестирования API САПР платформыОпыт тестирования API САПР платформы
Опыт тестирования API САПР платформы
 
Unity: "Очевидное-невероятное” или хитрости разработки на Unity Android
Unity: "Очевидное-невероятное” или хитрости разработки на Unity AndroidUnity: "Очевидное-невероятное” или хитрости разработки на Unity Android
Unity: "Очевидное-невероятное” или хитрости разработки на Unity Android
 
Знакомство с Tizen
Знакомство с TizenЗнакомство с Tizen
Знакомство с Tizen
 
Продуктивность и производительность в новых скриптовых языках / Антон Юдинцев...
Продуктивность и производительность в новых скриптовых языках / Антон Юдинцев...Продуктивность и производительность в новых скриптовых языках / Антон Юдинцев...
Продуктивность и производительность в новых скриптовых языках / Антон Юдинцев...
 
C++ в играх, больших и не очень
C++ в играх, больших и не оченьC++ в играх, больших и не очень
C++ в играх, больших и не очень
 
Алексей Андросов - Debugger: Отладка кода
Алексей Андросов - Debugger: Отладка кодаАлексей Андросов - Debugger: Отладка кода
Алексей Андросов - Debugger: Отладка кода
 
Внедрение параллельного рендеринга в игровой движок
Внедрение параллельного рендеринга в игровой движокВнедрение параллельного рендеринга в игровой движок
Внедрение параллельного рендеринга в игровой движок
 
"Инструментарий разработчика iOS: Xcode, AppCode и сторонние инструменты". Ма...
"Инструментарий разработчика iOS: Xcode, AppCode и сторонние инструменты". Ма..."Инструментарий разработчика iOS: Xcode, AppCode и сторонние инструменты". Ма...
"Инструментарий разработчика iOS: Xcode, AppCode и сторонние инструменты". Ма...
 
"Инструментарий разработчика iOS: Xcode, AppCode и сторонние инструменты". Ма...
"Инструментарий разработчика iOS: Xcode, AppCode и сторонние инструменты". Ма..."Инструментарий разработчика iOS: Xcode, AppCode и сторонние инструменты". Ма...
"Инструментарий разработчика iOS: Xcode, AppCode и сторонние инструменты". Ма...
 

More from SECON

SECON'2017, Куприенко Игорь, Университет 4.0: Ждать Нельзя Внедрять
SECON'2017, Куприенко Игорь, Университет 4.0: Ждать Нельзя ВнедрятьSECON'2017, Куприенко Игорь, Университет 4.0: Ждать Нельзя Внедрять
SECON'2017, Куприенко Игорь, Университет 4.0: Ждать Нельзя Внедрять
SECON
 
SECON'2017, Емельянов Игорь, Я хочу стать программистом: первые шаги.
SECON'2017, Емельянов Игорь, Я хочу стать программистом: первые шаги.SECON'2017, Емельянов Игорь, Я хочу стать программистом: первые шаги.
SECON'2017, Емельянов Игорь, Я хочу стать программистом: первые шаги.
SECON
 
SECON'2017, Тыкушин Анатолий, Болдырев Михаил, Расследование кибер-преступлений
SECON'2017, Тыкушин Анатолий, Болдырев Михаил, Расследование кибер-преступленийSECON'2017, Тыкушин Анатолий, Болдырев Михаил, Расследование кибер-преступлений
SECON'2017, Тыкушин Анатолий, Болдырев Михаил, Расследование кибер-преступлений
SECON
 
SECON'2017, Рожкова Надежда, Бухгалтерские лайфхаки для IT компаний
SECON'2017, 	Рожкова Надежда, Бухгалтерские лайфхаки для IT компанийSECON'2017, 	Рожкова Надежда, Бухгалтерские лайфхаки для IT компаний
SECON'2017, Рожкова Надежда, Бухгалтерские лайфхаки для IT компаний
SECON
 
SECON'2017, Янов Альберт, Управленческий учет в компании: для чего он нужен и...
SECON'2017, Янов Альберт, Управленческий учет в компании: для чего он нужен и...SECON'2017, Янов Альберт, Управленческий учет в компании: для чего он нужен и...
SECON'2017, Янов Альберт, Управленческий учет в компании: для чего он нужен и...
SECON
 
SECON'2017, Емелина Елена, Управленческий учет в софтверной компании на коленке
SECON'2017, Емелина Елена, Управленческий учет в софтверной компании на коленкеSECON'2017, Емелина Елена, Управленческий учет в софтверной компании на коленке
SECON'2017, Емелина Елена, Управленческий учет в софтверной компании на коленке
SECON
 
SECON'2017, Кузнецов Михаил, Самоуправляемая компания без бюрократии и фигни
SECON'2017, Кузнецов Михаил, Самоуправляемая компания без бюрократии и фигниSECON'2017, Кузнецов Михаил, Самоуправляемая компания без бюрократии и фигни
SECON'2017, Кузнецов Михаил, Самоуправляемая компания без бюрократии и фигни
SECON
 
SECON'2017, Коротков Анатолий, #noprojects #nomvp .. куда катится мир?
SECON'2017, Коротков Анатолий, #noprojects #nomvp .. куда катится мир?SECON'2017, Коротков Анатолий, #noprojects #nomvp .. куда катится мир?
SECON'2017, Коротков Анатолий, #noprojects #nomvp .. куда катится мир?
SECON
 
SECON'2017, Трошин Алексей, Выжить без менеджера: шаблоны правильных коммуник...
SECON'2017, Трошин Алексей, Выжить без менеджера: шаблоны правильных коммуник...SECON'2017, Трошин Алексей, Выжить без менеджера: шаблоны правильных коммуник...
SECON'2017, Трошин Алексей, Выжить без менеджера: шаблоны правильных коммуник...
SECON
 
SECON'2017, Цветцих Денис, Как добавить работе по Agile предсказуемости, не п...
SECON'2017, Цветцих Денис, Как добавить работе по Agile предсказуемости, не п...SECON'2017, Цветцих Денис, Как добавить работе по Agile предсказуемости, не п...
SECON'2017, Цветцих Денис, Как добавить работе по Agile предсказуемости, не п...
SECON
 
SECON'2017, Мартынов Антон, Опыт использования удаленных команд при реализаци...
SECON'2017, Мартынов Антон, Опыт использования удаленных команд при реализаци...SECON'2017, Мартынов Антон, Опыт использования удаленных команд при реализаци...
SECON'2017, Мартынов Антон, Опыт использования удаленных команд при реализаци...
SECON
 
SECON'2017, Цаль-Цалко Иван, Go на практике
SECON'2017, Цаль-Цалко Иван, Go на практикеSECON'2017, Цаль-Цалко Иван, Go на практике
SECON'2017, Цаль-Цалко Иван, Go на практике
SECON
 
SECON'2017, Неволин Роман, Функциональный C#
SECON'2017, Неволин Роман, Функциональный C#SECON'2017, Неволин Роман, Функциональный C#
SECON'2017, Неволин Роман, Функциональный C#
SECON
 
SECON'2017, Мелехова Анна, Архитектура как стихия. Обуздываем энтропию проекта
SECON'2017, Мелехова Анна, Архитектура как стихия. Обуздываем энтропию проектаSECON'2017, Мелехова Анна, Архитектура как стихия. Обуздываем энтропию проекта
SECON'2017, Мелехова Анна, Архитектура как стихия. Обуздываем энтропию проекта
SECON
 
SECON'2017, Макарычев Костантин, Использование Spark для машинного обучения
SECON'2017, Макарычев Костантин, Использование Spark для машинного обученияSECON'2017, Макарычев Костантин, Использование Spark для машинного обучения
SECON'2017, Макарычев Костантин, Использование Spark для машинного обучения
SECON
 
SECON'2017, Журавлев Денис, Маркетинг без маркетолога
SECON'2017, Журавлев Денис, Маркетинг без маркетологаSECON'2017, Журавлев Денис, Маркетинг без маркетолога
SECON'2017, Журавлев Денис, Маркетинг без маркетолога
SECON
 
SECON'2017, Шатров Михаил, Инструменты успешного предпринимателя
SECON'2017, Шатров Михаил, Инструменты успешного предпринимателяSECON'2017, Шатров Михаил, Инструменты успешного предпринимателя
SECON'2017, Шатров Михаил, Инструменты успешного предпринимателя
SECON
 
SECON'2017, Цымбал Дмитрий, Компания - Компания. Дружба на этом уровне.
SECON'2017, Цымбал Дмитрий, Компания - Компания. Дружба на этом уровне.SECON'2017, Цымбал Дмитрий, Компания - Компания. Дружба на этом уровне.
SECON'2017, Цымбал Дмитрий, Компания - Компания. Дружба на этом уровне.
SECON
 

More from SECON (20)

SECON'2017, LAZADA Effartlrss Shopping, Как мы тестируем?
 SECON'2017, LAZADA Effartlrss Shopping, Как мы тестируем? SECON'2017, LAZADA Effartlrss Shopping, Как мы тестируем?
SECON'2017, LAZADA Effartlrss Shopping, Как мы тестируем?
 
SECON'2017, Куприенко Игорь, Университет 4.0: Ждать Нельзя Внедрять
SECON'2017, Куприенко Игорь, Университет 4.0: Ждать Нельзя ВнедрятьSECON'2017, Куприенко Игорь, Университет 4.0: Ждать Нельзя Внедрять
SECON'2017, Куприенко Игорь, Университет 4.0: Ждать Нельзя Внедрять
 
SECON'2017, Васильков Василий, Elm в production
SECON'2017, Васильков Василий, Elm в productionSECON'2017, Васильков Василий, Elm в production
SECON'2017, Васильков Василий, Elm в production
 
SECON'2017, Емельянов Игорь, Я хочу стать программистом: первые шаги.
SECON'2017, Емельянов Игорь, Я хочу стать программистом: первые шаги.SECON'2017, Емельянов Игорь, Я хочу стать программистом: первые шаги.
SECON'2017, Емельянов Игорь, Я хочу стать программистом: первые шаги.
 
SECON'2017, Тыкушин Анатолий, Болдырев Михаил, Расследование кибер-преступлений
SECON'2017, Тыкушин Анатолий, Болдырев Михаил, Расследование кибер-преступленийSECON'2017, Тыкушин Анатолий, Болдырев Михаил, Расследование кибер-преступлений
SECON'2017, Тыкушин Анатолий, Болдырев Михаил, Расследование кибер-преступлений
 
SECON'2017, Рожкова Надежда, Бухгалтерские лайфхаки для IT компаний
SECON'2017, 	Рожкова Надежда, Бухгалтерские лайфхаки для IT компанийSECON'2017, 	Рожкова Надежда, Бухгалтерские лайфхаки для IT компаний
SECON'2017, Рожкова Надежда, Бухгалтерские лайфхаки для IT компаний
 
SECON'2017, Янов Альберт, Управленческий учет в компании: для чего он нужен и...
SECON'2017, Янов Альберт, Управленческий учет в компании: для чего он нужен и...SECON'2017, Янов Альберт, Управленческий учет в компании: для чего он нужен и...
SECON'2017, Янов Альберт, Управленческий учет в компании: для чего он нужен и...
 
SECON'2017, Емелина Елена, Управленческий учет в софтверной компании на коленке
SECON'2017, Емелина Елена, Управленческий учет в софтверной компании на коленкеSECON'2017, Емелина Елена, Управленческий учет в софтверной компании на коленке
SECON'2017, Емелина Елена, Управленческий учет в софтверной компании на коленке
 
SECON'2017, Кузнецов Михаил, Самоуправляемая компания без бюрократии и фигни
SECON'2017, Кузнецов Михаил, Самоуправляемая компания без бюрократии и фигниSECON'2017, Кузнецов Михаил, Самоуправляемая компания без бюрократии и фигни
SECON'2017, Кузнецов Михаил, Самоуправляемая компания без бюрократии и фигни
 
SECON'2017, Коротков Анатолий, #noprojects #nomvp .. куда катится мир?
SECON'2017, Коротков Анатолий, #noprojects #nomvp .. куда катится мир?SECON'2017, Коротков Анатолий, #noprojects #nomvp .. куда катится мир?
SECON'2017, Коротков Анатолий, #noprojects #nomvp .. куда катится мир?
 
SECON'2017, Трошин Алексей, Выжить без менеджера: шаблоны правильных коммуник...
SECON'2017, Трошин Алексей, Выжить без менеджера: шаблоны правильных коммуник...SECON'2017, Трошин Алексей, Выжить без менеджера: шаблоны правильных коммуник...
SECON'2017, Трошин Алексей, Выжить без менеджера: шаблоны правильных коммуник...
 
SECON'2017, Цветцих Денис, Как добавить работе по Agile предсказуемости, не п...
SECON'2017, Цветцих Денис, Как добавить работе по Agile предсказуемости, не п...SECON'2017, Цветцих Денис, Как добавить работе по Agile предсказуемости, не п...
SECON'2017, Цветцих Денис, Как добавить работе по Agile предсказуемости, не п...
 
SECON'2017, Мартынов Антон, Опыт использования удаленных команд при реализаци...
SECON'2017, Мартынов Антон, Опыт использования удаленных команд при реализаци...SECON'2017, Мартынов Антон, Опыт использования удаленных команд при реализаци...
SECON'2017, Мартынов Антон, Опыт использования удаленных команд при реализаци...
 
SECON'2017, Цаль-Цалко Иван, Go на практике
SECON'2017, Цаль-Цалко Иван, Go на практикеSECON'2017, Цаль-Цалко Иван, Go на практике
SECON'2017, Цаль-Цалко Иван, Go на практике
 
SECON'2017, Неволин Роман, Функциональный C#
SECON'2017, Неволин Роман, Функциональный C#SECON'2017, Неволин Роман, Функциональный C#
SECON'2017, Неволин Роман, Функциональный C#
 
SECON'2017, Мелехова Анна, Архитектура как стихия. Обуздываем энтропию проекта
SECON'2017, Мелехова Анна, Архитектура как стихия. Обуздываем энтропию проектаSECON'2017, Мелехова Анна, Архитектура как стихия. Обуздываем энтропию проекта
SECON'2017, Мелехова Анна, Архитектура как стихия. Обуздываем энтропию проекта
 
SECON'2017, Макарычев Костантин, Использование Spark для машинного обучения
SECON'2017, Макарычев Костантин, Использование Spark для машинного обученияSECON'2017, Макарычев Костантин, Использование Spark для машинного обучения
SECON'2017, Макарычев Костантин, Использование Spark для машинного обучения
 
SECON'2017, Журавлев Денис, Маркетинг без маркетолога
SECON'2017, Журавлев Денис, Маркетинг без маркетологаSECON'2017, Журавлев Денис, Маркетинг без маркетолога
SECON'2017, Журавлев Денис, Маркетинг без маркетолога
 
SECON'2017, Шатров Михаил, Инструменты успешного предпринимателя
SECON'2017, Шатров Михаил, Инструменты успешного предпринимателяSECON'2017, Шатров Михаил, Инструменты успешного предпринимателя
SECON'2017, Шатров Михаил, Инструменты успешного предпринимателя
 
SECON'2017, Цымбал Дмитрий, Компания - Компания. Дружба на этом уровне.
SECON'2017, Цымбал Дмитрий, Компания - Компания. Дружба на этом уровне.SECON'2017, Цымбал Дмитрий, Компания - Компания. Дружба на этом уровне.
SECON'2017, Цымбал Дмитрий, Компания - Компания. Дружба на этом уровне.
 

Recently uploaded

2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf
Хроники кибер-безопасника
 
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdfСИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
Хроники кибер-безопасника
 
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
Ирония безопасности
 
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Ирония безопасности
 
Cyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdfCyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdf
Хроники кибер-безопасника
 
CVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdfCVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdf
Хроники кибер-безопасника
 

Recently uploaded (9)

2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf
 
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdfСИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
 
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
 
Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdfMalware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
 
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
 
Cyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdfCyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdf
 
MS Navigating Incident Response [RU].pdf
MS Navigating Incident Response [RU].pdfMS Navigating Incident Response [RU].pdf
MS Navigating Incident Response [RU].pdf
 
CVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdfCVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdf
 
Ransomware_Q3 2023. The report [RU].pdf
Ransomware_Q3 2023.  The report [RU].pdfRansomware_Q3 2023.  The report [RU].pdf
Ransomware_Q3 2023. The report [RU].pdf
 

SECON'2016. Чубарь Алексей, Мобильные грабли Unity

  • 1. Грабли Unity3D Алексей Чубарь BIT.GAMES (Пенза) на примере Гильдии Героев
  • 2. О чём речь? 1. Почему Unity3D? 2. Влияние движка на пайплайн разработки. 3. Неожиданные технические проблемы и их решения. 4. Удобство Unity3D для подобных проектов.
  • 3. О чём речь? 1. Почему Unity3D? 2. Влияние движка на пайплайн разработки. 3. Неожиданные технические проблемы и их решения. 4. Удобство Unity3D для подобных проектов. Brace yourselves Technical mumbo-jumbo is coming
  • 4. Предпосылки перехода: жизнь до Web-browsers Flash/Action Script контент iOS, Android OpenGL ES/C++
  • 5. Предпосылки перехода: RPG ≠ Золушка • Срочно нужен прототип • 2D не катит • Нужны инструменты для создания контента
  • 18. Портирование с С++ • Семантика сохраняется, меняются только элементы синтаксиса. • Кодовая база C++ не пропадает даром.
  • 19. Расширяемость и препроцессинг • Утилита командной строки обрабатывает ассеты перед сборкой. • В редакторе обработка запускается из кастомного пункта меню.
  • 20. Расширяемость и всё остальное Расширения редактора могут быть любой сложности и назначения. У нас используются для: ● препроцессинга ассетов ● пакетной обработки графики ● отладки геймплея ● самых разных читов ● упрощения редактирования ● сборки DLC ● ...
  • 21. Скриптуемость - это... автоматизация сборки релизов. ● Выше скорость. ● Ниже влияние человеческого фактора.
  • 22. Скриптуемость - это... автоматизация функционального тестирования. ● Быстро. ● Дотошно. ● Не просит зарплату.
  • 23. Плагины и Asset Store • Проверенные решения многих задач. • Недорого/бесплатно. • Легко интегрировать. • О чём ещё мечтать?
  • 24. Плагины и Asset Store: функциональность Возможности кроссплатформенног о плагина Требуемый функционал Часть нужного функционала недоступна
  • 25. Плагины и Asset Store: настройка Плагинам иногда требуется внести изменения в конфигурацию приложения. Они могут делать это автоматически и удалять другие важные изменения. Следите за ними и отдавайте предпочтение ручной настройке. 1. 2. 3.
  • 26. Плагины и Asset Store: настройка Изменения в конфигурацию приложения могут вноситься и на этапе сборки. Редактор поочерёдно запускает все скрипты Editor/PostProcessBuildPlayer*. Затем вызывает все методы с атрибутом PostProcessBuild (PostProcessBuildAttribute) в порядке, указанном в скобках. Изучите эти скрипты и методы, если конфигурация внезапно поломалась.
  • 27. Плагины и Asset Store: настройка Чтобы результат выполнения скрипта никто не попортил, запускайте его последним Ваш скрипт Запредельный порядок выполнения
  • 28. Плагины и Asset Store: настройка Некоторые плагины имеют взаимоисключающие требования. Решение - препроцессинг конфигурационных файлов при сборке под конкретную платформу.
  • 29. Плагины и Asset Store: ограничения Android UserProfile.java MainActivity.java economics.jar .class .class classes.dex classes.dex Game.apk N methods M methods K methods S = N + M + K + ... ● S < 63000: OK. ● S > 65536: Ошибка сборки APK в Unity. ● 63000 < S <= 65536: FFFFUUUUU~!!
  • 30. Плагины и Asset Store: ограничения Android Выпилить лишние SDK: + Максимально просто - Эффективно “до следующего раза” - Лишние? Мне всё нужно! Выпиливать SDK в зависимости от платформы: • Относительно просто • Относительно эффективно - Легко облажаться Multidex: + Решит проблему, сохранив SDK - Экспорт проекта Android Studio - Лишнее остаётся в APK ProGuard: + Максимально эффективно - Экспорт проекта Android Studio - Требует настройки
  • 31. Плагины и Asset Store: поддержка В плагинах нередки баги. Поддержка и фиксы остаются на совести автора плагина. Фиксить баги самому мешает закрытый исходный код. Сообщество пользователей, как правило, невелико.
  • 32. Редактор: стабильность и производительность Редактор иногда падает. В новых версиях реже. Иморт/экспорт ассетов в один поток - долго. Облегчат жизнь: • SSD • Ramdisk • Десятки тысяч долларов на крутую билд-машину
  • 33. Редактор: MonoDevelop • Долго перезагружает проект после внешних изменений. • Иногда портит отступы в коде. • Дебаггер не всегда подключается. • Отладочная информация не всегда релевантна. Не повод отказываться от любимого текстового редактора, но может быть полезна для отладки в ряде случаев.
  • 34. Редактор: threading • Симуляция игры происходит в UI thread редактора. • Ошибка в скрипте может “повесить” Unity. • Запуск на устройстве даст больше информации о причине зависания. • Panic Button plugin прервёт любой скрипт в редакторе.
  • 35. Редактор: конфликты версий Если работать над проектом в разных версиях Unity, некоторые файлы спонтанно меняются. Это ведёт к конфликтам при слиянии. Держите всех на одной версии редактора.
  • 36. Редактор: экспорт DLC level1.prefab level2.prefab level3.prefab levels.unity3d 0x101B00B5DLC build #1 Контент не изменяется Client build Game client Ожидает 0x101B00B5 levels.unity3d 0xDEADBEEF DLC build #2 built-in hash:
  • 37. Редактор: подгрузка изменений Если игра запущена в редакторе, любое изменение кода её сломает ¯_(ツ)_/¯ Workaround: 1 файл = 1 MonoBehavior
  • 39. Компилятор и runtime: Garbage collection • Сборка мусора работает плохо. • Производительность игры со временем снижается. • “Ручного управления” освобождением памяти нет.
  • 40. Компилятор и runtime: Garbage collection ReferenceType class Entry { uint id; long phone; string name; } Thread stack var e1 = new Entry(); var e2 = e1; Managed heap ref1 Entry id: 1337 phone: 88005553535 name: ref2 String value: “Ayy Lmao” ref3
  • 41. Компилятор и runtime: Garbage collection ValueType struct Entry { uint id; long phone; string name; } Thread stack var e1 = new Entry(); var e2 = e1; Managed heap Entry id: 1337 phone: 88005553535 name: ref1 String value: “Ayy Lmao” Entry (сopy) id: 740 phone: 88005553535 name: ref2 e2.id = 740;
  • 42. Компилятор и runtime: Garbage collection Нужно снижать число аллокаций: • меньше временных объектов, аллоцируй однажды и переиспользуй; • ValueType вместо ReferenceType, где уместно; • гибридные контейнеры. refactor
  • 43. Компилятор и runtime: Garbage collection 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
  • 44. Компилятор и runtime: Garbage collection Встроенные возможности языка много аллоцируют. Зона риска: • foreach; • using; • Array.IndexOf и т.п.; • “Excessive” + “ strings “ + “concat”; • … • твоя киска Можно придумать неаллоцирующие замены.
  • 45. Компилятор и runtime: Garbage collection Boxing здорового человека Boxing C#-программиста struct Entry : IPrintable Thread stack var e1 = new Entry(); Entry Managed heap void MyCustomPrint(IPrintable p) Object (boxed Entry) IPrintable toPrint = e1; MyCustomPrint(toPrint); IPrintable ref1 Неявная аллокация
  • 46. Компилятор и runtime: повреждение стека При передаче крупных структур по значению возможно повреждение стека. Закономерность не установлена. Решение - передавать их по ссылке. Unity call stack be like: i == 2 i == 2 i == 2 i == -97
  • 47. Компилятор и runtime: креши UnityPlayer WindZone + UnloadUnusedAssets() = падение самого UnityPlayer на iOS. Соотнести причину со следствием было очень сложно. Пришлось отказаться от WindZone. UnityPlayer? More like UnityPrayer!
  • 48. Компилятор и runtime: JIT и AOT C# code JS code UnityScript code CIL CIL CIL Assembly.dll Sources Script compiler Mono runtime JIT AOT
  • 49. Компилятор и runtime: JIT и AOT C# code JS code UnityScript code CIL CIL CIL Assembly.dll Sources Script compiler Mono runtime JIT AOT
  • 50. Компилятор и runtime: жизнь без JIT на iOS Весь код должен быть виден и понятен среде выполнения при запуске: • Generics + Reflection = butthurt; • Generics + Native code = butthurt; • Delegates + Native code = butthurt; ... Страница “Troubleshooting on iOS devices” - ваш друг и помощник.
  • 51. Компилятор и runtime: жизнь без JIT на iOS C# JS US CIL CIL CIL Sources Script compiler Mono runtime JIT AOT dlldll C++ Native binary scripting backend: Mono scripting backend: IL2CPP Попытка использовать JIT ведёт к ExecutionEngineException При попытке использовать JIT не происходит НИЧЕГО DLL, собранные другим компилятором, не знают, что JIT недоступен
  • 52. Компилятор и runtime: жизнь без JIT на iOS • “Chat ConnectAsync…” выводится • “Chat Connecting…” - нет. Диагностика: • Переключить Scripting backend на Mono и словить ExecutionEngineException. Решения: • Использовать исходники вместо DLL. • Собрать DLL компилятором Unity.
  • 53. Компилятор и runtime: жизнь без JIT на iOS Workaround для проблемы с DLL: • объявлять операции add/remove у event явно. + Все компиляторы будут генерить одинаковый байткод. - Код становится менее компактным. - Про это каждый раз надо помнить.
  • 55. Оптимизация графики: сжатие текстур RGB ETC 4 bit, 1024х1024: 512KB RGBA 32 bit, 1024х1024: 4MB Alpha ETC 4 bit, 512x512: 128KB -84%
  • 56. Оптимизация графики: сжатие текстур RGB ETC 4 bit, 1024х1024: 512KB RGBA 32 bit, 1024х512: 2MB Alpha ETC 4 bit, 512x512: 128KB -69%
  • 57. Оптимизация графики: fillrate High-res background parts Lower-res RenderTexture High-DPI Device
  • 58. Оптимизация графики: fillrate High-res background parts Lower-res RenderTexture High-DPI Device Можно переиспользовать, если камера не движется
  • 59. Оптимизация графики: fillrate Нагрузка на GPU ниже, когда камера статична
  • 60. Зона видимых объектов Оптимизация графики: depth buffer Far Clip Plane Near Clip Plane Здесь ничего не рендерится Здесь ничего не рендерится
  • 61. Оптимизация графики: depth buffer Слишком широкий диапазон, низкая точность. Разрядность буфера зависит от GPU, на ряде устройств появляется Z-fighting. OK! Слишком узкий диапазон, отсекается больше, чем нужно
  • 63. Сообщество: Unity Answers • Огромная численность. • Преобладание начинающих разработчиков. • Много странных вопросов. • Много ответов на простые вопросы. • Мало ответов на сложные вопросы. 2006: 2016: The impact of Unity Answers
  • 64. Сообщество: участие Unity Technologies • Движок активно поддерживается. • Сообщество активно обсуждает релизы и использует issue tracker. • Представители Unity Technologies принимают участие в обсуждениях. • Графон всё лучше. • Развиваются веб-сервисы для Pro-пользователей (аналитика, crash reporting).
  • 65. TL;DR: Unity норм • Unity - это внушительный набор средств для разработки. • Бинарные ассеты - отстой, храните больше в текстовом виде. • Скриптуемость и расширяемость редактора - это очень круто. • There’s a [bad] plugin for that. • Отлаживать код не всегда удобно, используйте логи. • Аллокации - зло. • Желательно понимать, что там под капотом. • Учитывайте специфику мобильных устройств при оптимизации. • На сообщество надейся, а сам не плошай. Несмотря на подводные камни, достоинства перевешивают недостатки.