Play now

четверг, 16 октября 2014 г.

Unity: мобильная оптимизация на примере Alco Invaders


Две недели работал над портирование мобильной версии. Оптимизировал все что можно, и теперь игра работает на 40-60 fps на моем Kindle Fire.

Но даже со всеми улучшениями на Android сложно получить ту же картинку, что на скриншоте. Все дело в Image Effect , которые требуют Shader Model 2 (Bloom в моем случае). Даже на топовых Android девайсах этот эффект отключается при запуске игры. 

Намного лучше ситуация с iOS. При тестах на iPhone 5 и iPad mini все эффекты работали корректно, и графика выглядит на уровне PC. 

Теперь про оптимизацию производительности: 

- Cамым большим разочарованием стал iTweens. После 3 лет использования этой библиотеки оказалось,что она главный источник всех тормозов. И если на PC это не было явно заметно, то на планшете скорость падала в 1.5-2 раза. Особенно не советую использовать ее в циклах и Update. Поэтому от нее пришлось отказаться. 

Взамен написал свои функции плавного движения, используя  Mathf.Lerp(). Получился такой скрипт, который можно повесить на любой обьект http://pastebin.com/R7QUVmeu . Обращатся к нему через GetComponent<SmoothMove> ().SetTarget(Vector3) .

- Следующей простой оптимизацией стала замена всех new Vector3(), new Color() внутри циклов. Для этих целей лучше использовать глобальные переменные данных типов. Например как moveVector в коде выше. В результате не будут создаватся лишние новые обьекты по 60 раз в секунду.

- Тажке рекомендую отключить все динамические источники света ( у меня они были на лазерах :) Согласно документации Unity отрисовка (drawcall) происходит для каждого такого источника света. В итоге среднее колличество drawcall снизилось с 200 до 60, что было очень заметно на Android.

- Particles. Максимальное колличество частиц лучше ограничить 100-200 на один источник. А одновременное колличество источников частиц - не больше 10. Но это во многом зависит от того, как нагружает CPU все остальное в игровой сцене.


- Meshes. В результате тестирования оказалось, что мобильные устройства вполне справляются с 20 k полигонов. Конечно, чем меньше тем лучше, но и качество моделей от этого не должно сильно страдать. По возможности замените все мелкие 3d обьекты на 2d спрайты  (лазеры, ракеты и частички)



- Textures. Размер текстур я ограничил до 1024 px. Больше может потребоватся только для текстурных атласов. Если размер текстуры больше 1024 (например фона) то улучшения качества на мобильных практически не заметно. 
При этом размер инсталлера снижается значительно:  2 мб против 8 мб на каждую текстуру. По этим же причинам старайтесь использовать одни текстуры в разных местах (например один фон, но с разным цветом в материале)

- Управление. Отдельная тема- мобильное управление. Старайтесь всегда использовать Unity Remote, так как управление на touchscreen очень отличается от его симуляции мышкой. Это поможет избежать лишних багов и ускорит весь процесс портирования.

Больше по оптимизации можно прочитать в оффициальной документации:
 - Оптимизация графики
 - Оптимизация физики
 - Оптимизация скриптов

Другие способы оптимизации буду добавлять в статью со временем. 
Удачи в ваших разработках !

Комментариев нет:

Отправить комментарий