Play now

Показаны сообщения с ярлыком mobile. Показать все сообщения
Показаны сообщения с ярлыком mobile. Показать все сообщения

воскресенье, 21 июня 2015 г.

Unity optimisation tips


My previous article was in russian. So this I decided to write in English. 

Maybe you have heard or even already played Alco Invaders on PC. 

But we also make Alco Invaders for mobiles. We tested it on wide range of devices:

-Kindle Fire 1,
-HTC One,
-Nexus 4, 
-iPhone 4S, 
-iPad mini 2, 
- Galaxy Tab 4 
- and even tablet Windows 8.1.

So on all this devices we tried to achieve 50-60 fps performance. And we did it! And on almost all devices graphic level is the same as in PC. Except Kindle Fire - it doesn't support bloom :)





When we only started to work on game - performance was horrible. 15-20 fps on Android. But we decided make good picture in any way. 




In my previous article I have wrote about core elements of optimisation. And this about polishing optimisation. Secret tricks, which can save 20-30 % of performance.

1. Never use .transform in circles

It was a great surprise, when I discovered this thing. But in Unity .transform = .GetComponent<Transform>().

Example is Bullet script 
https://gist.github.com/Oxygamer/20100d06e11a8494042d

And getting component cost much in circles. In my tests it save almost 12 % of performance. So, make variable of type Transform and assign it in the Awake() function.


2. Vector3.Distance() is expensive enough.

The reason - is Mathf.Sqrt() inside this function.

So if you can - better use predefined table of distances or calculate it not in Update().
I used such trick in my Hexagon particle system. 

If you have some kind of grid - calculate distances between all elements and write it to simple array float[].

It saves ~ 10 % performance.




3. Almost all physical is expensive.

Maybe it's obvious, but you can forget about physics of explosion, or bullets. Check all them and try not use much physical objects in one time.



4. Use delayed trash cleaning.

For this purpose better use .SetActive(false), store object to some list, and Destroy() it in pause or end of level. It depends of your game type.

5. Shaders - use VertexLit if you can.

Maybe it's not huge difference between VertexLit and Diffuse, but Specular cost much. The reason is per pixel light rendering in Diffuse/Specular shaders and per vertex in VertexLit.




6. Use Dictionary<key,value> for prefab storage.

It's useful when you searching object with some name or type.  For example you can use List<> for Editor, and then put all this prefabs to Dictionary<> on game start.

As example - Object Storage script

https://gist.github.com/Oxygamer/c93d958ae138aef607b2

P.S

Hope this tricks and techniques will be useful for you ! If you have some questions - write it in comments. I will help with gladness :)

суббота, 16 мая 2015 г.

Alco Invaders Mobile

Свершилось ! 

Мы закончили всю основную работу на мобильной версией AlcoInvaders. Теперь осталось найти способ, как донести ее до игроков :) 

Во время работы над мобильной версией собралось много советов по оптимизации. Поэтому в ближайшие дни напишу еще один пост посвященный глубокой оптимизации на Android и iOS. А пока выложу последние скрины из игры. 








понедельник, 10 ноября 2014 г.

Новости разработки. Волны частичек и мобильный интерфейс.

Решил рассказать, чем занимался последние недели и показать результаты. Начну с того,что наш с другом проект находится на финальной стадии, когда сделано все что планировалось изначально и даже больше. 

Сейчас все время уходит на улучшения внешнего вида (эффекты, фоны) и оптимизацию производительности. С внешним видом получилось очень даже хорошо. Частички, о которых я писал ранее удачно сочетаются с космосом и общей атмосферой  dicso-party. 




После этого мы выпустили обновление 1.66 для PC,Mac версии, которая доступна здесь . 
Вторым важным направлением стала мобильная разработка. Хоть собрать android/ios сборку не сложно на Unity, но самые большие измения пришлось сделать в интерфейсе и управлении. Если на PC хорошо работает сочетание мышка/клавиатура, то для touch screen нужен совсем другой подход. 

Сначала мы ничего не меняли, и процесс игры был похож на закликивание экрана планшета. Это было утомительно для новых игроков, и иногда приводило их в ярость (когда не успевали за скоростью игры) . В итоге решили сменить систему управления на более простую - автоматическая атака выбранной цели. Это позволило уменьшить колличество кликов раз в 10 и освободило внимание для более стратегического подхода и использования скиллов. 



Также мы изменили положение и внешний вид джойстика. Он стал более чувствительным и главное, не закрывает собой корабль игрока. 

В других разделах игры ( Cocktail Mixer и Upgrade Shop ) мы увеличили размер всех кнопочек и иконок. Перетаскивание ингридиентов для коктейля заменили простым нажатием по иконкам. 

Сейчас заново настраиваем баланс для мобильной версии, и скорее всего сделаем несколько уровней сложности. 

На этом этапе очень не хватает игроков для тестирования. Так как хочется, чтобы игру могли оценить свежим взглядом и заметить те вещи, к которым мы уже привыкли в процессе разработки. Размещать ее в маркет пока не будем - еще есть шансы найти издателя, которому игра прийдется по душе. 

Если кто хочет помочь в тестировании - пишите на почту oxygamer@gmail.com или в скайп Oxygame. Всем тестировщикам - ключи для PC/Mac версии и попадание в титры :) 

четверг, 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 очень отличается от его симуляции мышкой. Это поможет избежать лишних багов и ускорит весь процесс портирования.

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

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