Как оптимизировать 2D игру?

Раздел, посвящённый самому важному - скорости.

Как оптимизировать 2D игру?

Сообщение ADev 30 июл 2015, 18:23

Здравствуйте!
Я создаю простенькую breakout игру на Android и iOS. При тестировании на смартфоне иногда заметны подлагивания, поэтому встал вопрос оптимизации. Но так как это моя первая игра, то я не знаю как оптимизировать. Почитал в интернете - полез в профайлер Юнити, включив Deep Profile. В итоге выяснилось, что всегда на первом месте по времени стоит WaitForTargetFPS (~95%), иногда вскакивает BehavioutUpdate (~10%). Насколько я понял BehaviourUpdate это скрипты? Потому что если развернуть, то там будут названия функций.

Так вот, на первом месте в BU всегда стоит Brick.Update(). Сама по себе функция легкая:

Синтаксис:
Используется csharp
void Update () {
       if (!GameManager.Instance.isEnd) {
                        brickTransform.position += new Vector3 (0, -0.1f, 0);

                        if (brickTransform.position.y <= GameManager.Instance.lastY)
                                GameManager.Instance.isEnd=true;

                }
        }
 


Но из-за того, что в игре на одной сцене порядка 42-50 таких кирпичей, то смена позиции отбирает целых 4% времени. Также каждые N секунд я Instatiate 7 новых кирпичей, что тоже не вери гуд. Как мне все это оптимизировать? А то я вообще не понимаю, что тут можно изменить.

UPD. Я сделал 1 parent объект, к которому привязывал новые кирпичи. И двигал непосредственно его. На количество DC это никак не повлияло.
ADev
UNец
 
Сообщения: 36
Зарегистрирован: 22 июл 2015, 20:25

Re: Как оптимизировать 2D игру?

Сообщение DualPain 30 июл 2015, 19:30

Deep Profile искажает относительную нагрузку, т.е. при включенной опции нельзя определить что именно больше жрет. Профилируйте обычным профайлером.
Сколько дк у вас на сцене? сколько трисов и вертексов? есть ли физика, если есть, то какая иерархия? Какой девайс, на котором тестируете?
По поводу оптимизации апдейтов: если нет необходимости обновляться каждый кадр, то надо вводить переменную частоты обновления. Например, обновлять 5 раз в секунду, а не реальным количеством кадров
DualPain
Старожил
 
Сообщения: 727
Зарегистрирован: 11 янв 2013, 01:18
Skype: demon21.09

Re: Как оптимизировать 2D игру?

Сообщение DualPain 30 июл 2015, 19:38

Чтобы не вызывать Instantiate используйте пул.
[url]https://ru.wikipedia.org/wiki/Объектный_пул[/url]
DualPain
Старожил
 
Сообщения: 727
Зарегистрирован: 11 янв 2013, 01:18
Skype: demon21.09

Re: Как оптимизировать 2D игру?

Сообщение ADev 30 июл 2015, 19:51

У меня в stats как таковые Draw Calls не показываются, показываются Batches. Их в начальный момент 42-43, далее по нарастающей, бывает доходит до 60.
Физика есть, но ригидбоди только один, у остальных объектов только коллайдеры. Что такое иерархия в физике не знаю.(
Что такое трисы и вертексы тоже не знаю (я новичек в юнити).
Тестирую на Galaxy S4 Mini.
Простите за мою тупость (много чего не знаю, не понимаю), но я только неделю на юнити сижу...

Пропрофилировал на смартфоне, оказалось, что 40% это Render.transparetGeometry. Не знаю, много это или мало...
ADev
UNец
 
Сообщения: 36
Зарегистрирован: 22 июл 2015, 20:25

Re: Как оптимизировать 2D игру?

Сообщение ADev 31 июл 2015, 07:57

Только что почитал про трисы и вертексы: их у меня совсем мало 312 и 563 соответственно. У меня на телефоне игра идет плавно в основное время, но иногда случаются скачки производительности, не знаю почему.
ADev
UNец
 
Сообщения: 36
Зарегистрирован: 22 июл 2015, 20:25

Re: Как оптимизировать 2D игру?

Сообщение DualPain 31 июл 2015, 12:20

видимо у вас не работает батчинг, нужно смотреть проект, по словам мало что понятно, пакуйте демку, давайте ссылку
DualPain
Старожил
 
Сообщения: 727
Зарегистрирован: 11 янв 2013, 01:18
Skype: demon21.09

Re: Как оптимизировать 2D игру?

Сообщение i_am_kisly 31 июл 2015, 13:06

Их в начальный момент 42-43

Атласы используются ?
Текущие проекты: [Lineage2 unity5][_blog non6.blogspot.ru ]
i_am_kisly
Старожил
 
Сообщения: 742
Зарегистрирован: 10 фев 2015, 17:26
  • Сайт

Re: Как оптимизировать 2D игру?

Сообщение ADev 31 июл 2015, 22:03

Атласы не используются, спрайт скейлится под размер экрана.
Демка - проект? Мне его заархивировать и сюда ссылку дать?
ADev
UNец
 
Сообщения: 36
Зарегистрирован: 22 июл 2015, 20:25

Re: Как оптимизировать 2D игру?

Сообщение DualPain 01 авг 2015, 01:20

да, можно так, можно сделать юнити пакейдж
DualPain
Старожил
 
Сообщения: 727
Зарегистрирован: 11 янв 2013, 01:18
Skype: demon21.09

Re: Как оптимизировать 2D игру?

Сообщение ADev 01 авг 2015, 13:20

https://yadi.sk/d/gNnH71ERiDCCj
Вот мой проект.
ADev
UNец
 
Сообщения: 36
Зарегистрирован: 22 июл 2015, 20:25

Re: Как оптимизировать 2D игру?

Сообщение DualPain 01 авг 2015, 14:53

1. такой код дал прирост производительности этого метода примерно в 5 раз (было 0.16-0.2мс, стало 0.02-0.04мс)
Синтаксис:
Используется csharp
public class BrickField : MonoBehaviour
{

    private Rigidbody2D _rigidbody;
    private Vector2 _offset = new Vector2(0, -0.1f);

        void Start ()
        {
            _rigidbody = gameObject.AddComponent<Rigidbody2D>();
            _rigidbody.isKinematic = true;
        }
       
        void Update () {
                if (!GameManager.Instance.isEnd)
                {
                    _rigidbody.position += _offset;
                }
        }
}

так же надо убрать галочку статик с префабов кирпичиков. Спросите почему? Потому что нельзя двигать статик колайдеры, ни один не статик колайдер не должен быть без риджит боди.
Курите http://docs.unity3d.com/ru/current/Manual/CollidersOverview.html

2. У вас вообще не работает батчинг, нужно объединять все спрайты в атлас, разделать на отдельные при помощи этого
http://docs.unity3d.com/ru/current/Manual/SpriteEditor.html

Это из самого критичного что первое бросилось в глаза. Наверняка есть еще косяки, но вы их уже как-то сами...
DualPain
Старожил
 
Сообщения: 727
Зарегистрирован: 11 янв 2013, 01:18
Skype: demon21.09

Re: Как оптимизировать 2D игру?

Сообщение ADev 01 авг 2015, 16:20

Ура!
Объединил все спрайты кирпичей в один атлас, разделил, кол-во DC уменьшилось до 9!

Спасибо тебе огромное, DualPain! :ymhug:

P.S. Это нормально, что в Stats сколько было FPS при 42 DC, столько и осталось пр 9 DC (70-75 FPS).
ADev
UNец
 
Сообщения: 36
Зарегистрирован: 22 июл 2015, 20:25

Re: Как оптимизировать 2D игру?

Сообщение DualPain 01 авг 2015, 17:07

во-первых, у тебя включена вертикальная синхронизация. Она будет резать фпс до 60
во-вторых, статс считает не верный фпс (вообще непонятно что он считает), в стандартных асетах юнити есть скрипт нормального счетчика фпс, ну или найди в интернете.
Физику поправил?
DualPain
Старожил
 
Сообщения: 727
Зарегистрирован: 11 янв 2013, 01:18
Skype: demon21.09

Re: Как оптимизировать 2D игру?

Сообщение ADev 01 авг 2015, 18:14

Да, статики с кирпичей убрал, а насчет метода с BrickField - когда заменил код, кирпичи перестали уничтожаться при попадании, поэтому пришлось вернуть как было.
ADev
UNец
 
Сообщения: 36
Зарегистрирован: 22 июл 2015, 20:25

Re: Как оптимизировать 2D игру?

Сообщение DualPain 01 авг 2015, 18:47

надо разобраться почему так, не статик колайдеры не могут быть без риджит боди, а риджит боди нельзя двигать через трансформ.
В общем, если не хочешь через время возвращаться к вопросу оптимизации, то разберись с физикой нормально. Я написал, что твой вариант смещений кирпичей в 4 раза тяжелее чем должен быть
DualPain
Старожил
 
Сообщения: 727
Зарегистрирован: 11 янв 2013, 01:18
Skype: demon21.09

След.

Вернуться в Оптимизация

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2