Страница 1 из 4
Как оптимизировать 2D игру?
Добавлено:
30 июл 2015, 18:23
ADev
Здравствуйте!
Я создаю простенькую 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 это никак не повлияло.
Re: Как оптимизировать 2D игру?
Добавлено:
30 июл 2015, 19:30
DualPain
Deep Profile искажает относительную нагрузку, т.е. при включенной опции нельзя определить что именно больше жрет. Профилируйте обычным профайлером.
Сколько дк у вас на сцене? сколько трисов и вертексов? есть ли физика, если есть, то какая иерархия? Какой девайс, на котором тестируете?
По поводу оптимизации апдейтов: если нет необходимости обновляться каждый кадр, то надо вводить переменную частоты обновления. Например, обновлять 5 раз в секунду, а не реальным количеством кадров
Re: Как оптимизировать 2D игру?
Добавлено:
30 июл 2015, 19:38
DualPain
Чтобы не вызывать Instantiate используйте пул.
[url]https://ru.wikipedia.org/wiki/Объектный_пул[/url]
Re: Как оптимизировать 2D игру?
Добавлено:
30 июл 2015, 19:51
ADev
У меня в stats как таковые Draw Calls не показываются, показываются Batches. Их в начальный момент 42-43, далее по нарастающей, бывает доходит до 60.
Физика есть, но ригидбоди только один, у остальных объектов только коллайдеры. Что такое иерархия в физике не знаю.(
Что такое трисы и вертексы тоже не знаю (я новичек в юнити).
Тестирую на Galaxy S4 Mini.
Простите за мою тупость (много чего не знаю, не понимаю), но я только неделю на юнити сижу...
Пропрофилировал на смартфоне, оказалось, что 40% это Render.transparetGeometry. Не знаю, много это или мало...
Re: Как оптимизировать 2D игру?
Добавлено:
31 июл 2015, 07:57
ADev
Только что почитал про трисы и вертексы: их у меня совсем мало 312 и 563 соответственно. У меня на телефоне игра идет плавно в основное время, но иногда случаются скачки производительности, не знаю почему.
Re: Как оптимизировать 2D игру?
Добавлено:
31 июл 2015, 12:20
DualPain
видимо у вас не работает батчинг, нужно смотреть проект, по словам мало что понятно, пакуйте демку, давайте ссылку
Re: Как оптимизировать 2D игру?
Добавлено:
31 июл 2015, 13:06
i_am_kisly
Их в начальный момент 42-43
Атласы используются ?
Re: Как оптимизировать 2D игру?
Добавлено:
31 июл 2015, 22:03
ADev
Атласы не используются, спрайт скейлится под размер экрана.
Демка - проект? Мне его заархивировать и сюда ссылку дать?
Re: Как оптимизировать 2D игру?
Добавлено:
01 авг 2015, 01:20
DualPain
да, можно так, можно сделать юнити пакейдж
Re: Как оптимизировать 2D игру?
Добавлено:
01 авг 2015, 13:20
ADev
Re: Как оптимизировать 2D игру?
Добавлено:
01 авг 2015, 14:53
DualPain
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.html2. У вас вообще не работает батчинг, нужно объединять все спрайты в атлас, разделать на отдельные при помощи этого
http://docs.unity3d.com/ru/current/Manual/SpriteEditor.htmlЭто из самого критичного что первое бросилось в глаза. Наверняка есть еще косяки, но вы их уже как-то сами...
Re: Как оптимизировать 2D игру?
Добавлено:
01 авг 2015, 16:20
ADev
Ура!
Объединил все спрайты кирпичей в один атлас, разделил, кол-во DC уменьшилось до 9!
Спасибо тебе огромное, DualPain!
P.S. Это нормально, что в Stats сколько было FPS при 42 DC, столько и осталось пр 9 DC (70-75 FPS).
Re: Как оптимизировать 2D игру?
Добавлено:
01 авг 2015, 17:07
DualPain
во-первых, у тебя включена вертикальная синхронизация. Она будет резать фпс до 60
во-вторых, статс считает не верный фпс (вообще непонятно что он считает), в стандартных асетах юнити есть скрипт нормального счетчика фпс, ну или найди в интернете.
Физику поправил?
Re: Как оптимизировать 2D игру?
Добавлено:
01 авг 2015, 18:14
ADev
Да, статики с кирпичей убрал, а насчет метода с BrickField - когда заменил код, кирпичи перестали уничтожаться при попадании, поэтому пришлось вернуть как было.
Re: Как оптимизировать 2D игру?
Добавлено:
01 авг 2015, 18:47
DualPain
надо разобраться почему так, не статик колайдеры не могут быть без риджит боди, а риджит боди нельзя двигать через трансформ.
В общем, если не хочешь через время возвращаться к вопросу оптимизации, то разберись с физикой нормально. Я написал, что твой вариант смещений кирпичей в 4 раза тяжелее чем должен быть