Производительность unity3d: подводные камни / Алексей...
- Home
- Engineering
- Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)
TRANSCRIPT
Производительность Unity3D подводные камниАлексей Чубарь BITGAMES
Unity3D
Рендеринг
Анимации
Звук
Физика
Редактор
Оптимизация
hellip
Unity3D
Unity3D
Unity3D
Unity3D
9 FPSШМЯК БРЯК
И В ПРОДАКШН
Unity3D
PC amp Console games Mobile games
Architectural visualizations
Medical simulations
Military simulations
CAD
Research
Interactive presentations
hellip
Education
Media amp movies
Art installations
Unity3D
PC amp Console games Mobile games
Architectural visualizations
Medical simulations
Military simulations
CAD
Research
Interactive presentations
hellip
Education
Media amp movies
Art installations
Суровый мир мобильных игр
Суровый мир мобильных игрbull Высокая конкуренция
Суровый мир мобильных игрbull Высокая конкуренцияbull Специфика аудитории
Суровый мир мобильных игрbull Высокая конкуренцияbull Специфика аудиторииbull Специфика программно-аппаратной платформы
Что там внутриbull Какой-то странный процессорbull ARM x86 MIPShellip 32 и 64 bit
bull Какой-то странный процессорbull ARM x86 MIPShellip 32 и 64 bit
Что там внутри
ne
Что там внутриbull Какая-то батарейка
Что там внутриbull Какой-то графический ускоритель
ne
Что там внутриbull Какая-то оперативная памятьbull Её всегда мало
Зоопарк устройств
Зоопарк устройств
240 MB ought to be enough for anyone ndash Gill Bates
bull Падение FPSbull Чёрные квадраты вместо текстурbull laquoТихоеraquo завершение приложения без отчёта об ошибке
Зоопарк устройств
gt240 MB
Главный советldquoMake optimization a design consideration not a final steprdquo
- Unity Docs
Главный советldquoMake optimization a design consideration not a final steprdquo
- Unity Docs
Постоянно спрашивай себя ldquoА не ерунду ли я сейчас делаюrdquo- Примерный перевод
Из-за чего всё тормозит
Из-за чего всё тормозитbull Код
Из-за чего всё тормозитbull Код bull Ресурсы
Импорт ресурсов
Импорт ресурсов звук
Импорт ресурсов звук
16 bit 44100 Hz 2 channels = 1764 KBs
Импорт ресурсов звук
16 bit 44100 Hz 2 channels = 1764 KBs
Импорт ресурсов звукbull Сжатие MP3 на iOSbull Сжатие Vorbis на Androidbull Force Monobull Низкий битрейт (насколько возможно)
ne
Импорт ресурсов анимации
Импорт ресурсов анимацииbull Сложные анимации занимают много памяти KISS
Импорт ресурсов анимацииbull Сложные анимации занимают много памяти KISSbull Анимация большого числа объектов нагружает ЦП
Импорт ресурсов анимацииbull Сложные анимации занимают много памяти KISSbull Анимация большого числа объектов нагружает ЦПbull Можно уменьшить количество объектов
Импорт ресурсов анимацииbull Сложные анимации занимают много памяти KISSbull Анимация большого числа объектов нагружает ЦПbull Можно уменьшить количество объектовbull Можно упростить объекты
Импорт ресурсов 3D-моделиbull Отключите ReadWritebull Много полигонов = много памятиbull Optimize Mesh Data
Импорт ресурсов 3D-модели
Точно ли это всё понадобится
Импорт ресурсов текстурыbull Сжатие обязательно
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
bull Не включайте ReadWritebull Отключите mipmaps если возможноbull Не используйте огромные текстурыbull 2048x2048 или 1024x1024 для UIbull 512x512 или меньше для текстур моделей
Импорт ресурсов текстуры
Допустимо если есть запас производительности GPU
-50
-33
Fillrate amp overdraw
OK
Overdrawn
Борьба с overdrawHigh-res
background partsLower-res
RenderTextureHigh-DPI Device
Борьба с overdrawHigh-res
background partsLower-res
RenderTextureHigh-DPI Device
Можно переиспользовать если камера не движется
Борьба с overdraw
Нагрузка на GPU ниже когда камера статична
Код и runtime
Код и runtime
C code
JS code
UnityScript code
CIL
CIL
CIL
Assemblydll
Sources Script compiler Mono runtime
JIT
AOT
Код и runtime
C code
JS code
UnityScript code
CIL
CIL
CIL
Assemblydll
Sources Script compiler Mono runtime
JIT
AOT
OLD ampBAD
Код и runtimebull Сборка мусора работает плохоbull Heap удваивается при достижении лимита И не уменьшается никогдаbull Производительность игры со временем снижается
Код и runtime Garbage collectionReferenceType
class Entry uint id long phone string name
Thread stack (FAST)
var e1 = new Entry()
var e2 = e1
Managed heap (SLOW)
ref1
Entryid 1337
phone 88005553535
name ref2
Stringvalue ldquoAyy Lmaordquo
ref3
Код и runtime Garbage collectionValueType
struct Entry uint id long phone string name
Thread stack (FAST)
var e1 = new Entry()
var e2 = e1
Managed heap (SLOW)
Entryid 1337
phone 88005553535
name ref1
Stringvalue ldquoAyy Lmaordquo
Entry (сopy)id 740
phone 88005553535
name ref2e2id = 740
Код и runtime аллокацииbull ValueType вместо ReferenceType где уместно
Код и runtime аллокацииbull ValueType вместо ReferenceType где уместноbull Меньше временных объектов аллоцируй однажды и переиспользуй
Код и runtime аллокации
Refactor
public static class Modifiers public ListltModifiergt GetAll() var tmp = new ListltModifiergt()
FillStuff(tmp) return tmp
public static class Modifiers public void GetAll(ListltModifiergt to_fill) to_fillClear() FillStuff(to_fill)
public void Update() ListltModifiergt modifiers = ModifiersGetAll() DisplayModifiers(modifiers)
ListltModifiergt = new ListltModifiergt(CAPACITY)
public void Update() ModifiersGetAll(modifiers) DisplayModifiers(modifiers)
Код и runtime аллокацииbull ValueType вместо ReferenceType где уместноbull Меньше временных объектов аллоцируй однажды и переиспользуйbull laquoГибридныеraquo контейнеры
Код и runtime аллокацииstruct HListltTgt IListltTgtгибридный контейнер
T val0
T val1
T val2
T val3
ListltTgt fallback T TT
myHListAdd(newVal)
Count gt Capacity
Truealloc fallback once
Falseno allocs
Код и runtime неявные аллокацииbull Regex
Код и runtime неявные аллокацииbull Regexbull ldquoExcessiverdquo + ldquo strings ldquo + ldquoconcatrdquo
Код и runtime неявные аллокацииbull Regexbull ldquoExcessiverdquo + ldquo strings ldquo + ldquoconcatrdquobull Closures amp anon methods
public void LoginWithID(int id) if(IsLoggedIn()) return
LoginWithDelegate( delegate() ProcessNewID(id) )
Вы ещё здесьhellip
hellip а эти объекты уже созданы в heap
ldquoidrdquo используется в closure копия создаётся в heap
Код и runtime неявные аллокацииbull Regexbull ldquoExcessiverdquo + ldquo strings ldquo + ldquoconcatrdquobull Closures amp anon methodsbull LINQ
Код и runtime неявные аллокацииbull Regexbull ldquoExcessiverdquo + ldquo strings ldquo + ldquoconcatrdquobull Closures amp anon methodsbull LINQ
bull foreach
Код и runtime неявные аллокацииbull Regexbull ldquoExcessiverdquo + ldquo strings ldquo + ldquoconcatrdquobull Closures amp anon methodsbull LINQ
bull foreachbull using
Код и runtime неявные аллокацииbull Regexbull ldquoExcessiverdquo + ldquo strings ldquo + ldquoconcatrdquobull Closures amp anon methodsbull LINQ
bull foreachbull usingbull ArrayIndexOf и тпbull hellip
Код и runtime boxingstruct Entry IPrintable
Thread stack
var e1 = new Entry()Entry
Managed heapvoid MyPrint(IPrintable p)
Object (boxed Entry)
IPrintable toPrint = e1MyPrint(toPrint) IPrintable ref1
Неявная аллокация
Код и runtime аллокации Unity APISkinnedMeshRenderer smr =
for(int i = 0 i lt smrbonesLength i++) Do stuff
SkinnedMeshRenderer smr = var bones = smrbones
for(int i = 0 i lt bonesLength i++) Do stuff
Код и runtime аллокации Unity APISkinnedMeshRenderer smr =
for(int i = 0 i lt smrbonesLength i++) Do stuff
SkinnedMeshRenderer smr = var bones = smrbones
for(int i = 0 i lt bonesLength i++) Do stuff
Аллоцирует массив ldquobonesrdquobonesLength раз
Аллоцирует массив ldquobonesrdquo1 раз
Код и runtime аллокации Unity APIbull Если Unity API возвращает массив будет создана новая копия
Код и runtime аллокации Unity APIbull Если Unity API возвращает массив будет создана новая копияbull Каждый раз
Код и runtime аллокации Unity APIbull Если Unity API возвращает массив будет создана новая копияbull Каждый разbull Даже если значение не изменилось
Код и runtime аллокации Unity APIbull Если Unity API возвращает массив будет создана новая копияbull Каждый разbull Даже если значение не изменилосьbull Даже если это выглядит как безобидный getter
Код и runtime аллокации Unity APIbull Если Unity API возвращает массив будет создана новая копияbull Каждый разbull Даже если значение не изменилосьbull Даже если это выглядит как безобидный getterbull laquoБезобидный getterraquo может скрывать внутри тяжёлые вычисления
public string name get return BadWordsFilterReplaceAll(datanameUnescape())
Код и runtime прочееbull No inliningbull Вызов метода С = вызов в машинном кодеbull Property accessors = вызов метода
bull Это сказывается на скорости интенсивных вычисленийbull Do inlining yourself
Код и runtime прочееbull К свойствам некоторых компонентов можно обращаться по
имени (Animator Shader Material)bull Внутри имя каждый раз преобразовывается в хэшbull Вычисли хэш однажды и переиспользуй
materialSetColor(ldquo_Colorrdquo Colorwhite)animatorSetTrigger(ldquoattackrdquo)
static readonly int HASH_MAT_COLOR = ShaderPropertyToID(ldquo_Colorrdquo)static readonly int HASH_ANIM_ATTACK = AnimatorStringToHash(ldquoattackrdquo)
materialSetColor(HASH_MAT_COLOR Colorwhite)animatorSetTrigger(HASH_ANIM_ATTACK)
Код и runtime прочееbull Reflection is slowbull Text parsing is slow
bull Text parsers based on Reflection are super slow
Профайлинг
Профайлингbull Встроенный профайлер Unity
Профайлингbull Встроенный профайлер Unitybull XCode Instruments
ПрофайлингСкорость итераций
Сложность интерпретации Точность Поддержка
ОС
Unity (редактор)
Очень высокая Низкая Низкая -
Unity(устройство) Низкая Низкая Средняя Любая
XCodeInstruments Низкая Средняя Очень
высокая Только iOS
Профайлинг1401 MB
Unity
Профайлинг Unity врёт1401 MB
2620 MB
Unity
XCode
Профайлинг Unity врёт1401 MB
2620 MB
Unity
XCode