Оптимизация

Программирование для iPhone & Android

Оптимизация

Сообщение jeyson 16 мар 2010, 12:17

Давайте тут думать про оптимизацию, и ,если можно, делится своими знаниями, находками ;)

Мой вопрос. Что же будет лучше:
1) один скрипт-менеджер, собравший компоненты (нужного типа) в массив со всех объектов, далее в цикле обрабатывая паблик параметры.

2) скрипты с цикличными коротинам while (true) { yield return new WaitForFixedUpdate() } на каждом объекте в которых обрабатываются те самые паблик параметры

3) или как обычно все обрабатывать в FixedUpdate() в каждом скрипте
Последний раз редактировалось jeyson 16 мар 2010, 13:14, всего редактировалось 2 раз(а).
Аватара пользователя
jeyson
UNIт
 
Сообщения: 113
Зарегистрирован: 15 апр 2009, 22:22
Откуда: Ижевск
  • ICQ

Re: Оптимизация

Сообщение Neodrop 16 мар 2010, 12:21

Вообще желательно ничего не связанного с физикой, в FixedUpdate не обрабатывать.
Update вполне можно заменить коратинами. Они легче. У меня есть пример тут на форуме, где 10 000 объектов в коратинах что-нить проверяют. На работу всех 10 000 скриптов уходит 1 миллисекунда.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Оптимизация

Сообщение gnoblin 16 мар 2010, 13:18

bm, что-то ты с FixedUpdate действительно загнул :D
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Оптимизация

Сообщение jeyson 16 мар 2010, 14:03

а чем как не вариант :D

как я вижу картину:
- FixedUpdate() вызывается через мессейдж, что вроде как не мало кушает тактов, чем обычный прямой доступ к методу?
- Coroutine: один вызов, и работаем в цикле while(true), но опять же имеем точки входа и выхода, и должны получить два calls?

вывод: лучше одна коротина-менеджер и куча паблик данных?
Аватара пользователя
jeyson
UNIт
 
Сообщения: 113
Зарегистрирован: 15 апр 2009, 22:22
Откуда: Ижевск
  • ICQ

Re: Оптимизация

Сообщение Neodrop 16 мар 2010, 14:58

Не вижу смысла валить весь код в одну топку. Я же говорю - 10 000 коратин берут 1 миллисекунду. На мобилке побольше, конечно, но тебе там столько никогда и не понадобится.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Оптимизация

Сообщение jeyson 17 мар 2010, 01:40

Провел не один тест, устал :) результат:

- Если ваше приложение не будет использовать аккелерометер, то лучше его отключить (выставить в 0) в AppController.mm, что придаст немало fps :
Код: Выделить всё
#define kAccelerometerFrequency   0.0


- !!! НИКАКИХ !!! new (типа new Vectro3(x,y,z), new Rect()) в циклах и часто вызываемых местах!!!

- FixedUpdate это очень медленно;

- Update() в 1.5 раза быстрее коротинов;

- В настройках Editor -> Player -> iPhone Script Call Optimisation выставлять (если не дебажите) параметр Fast but no Exceptions (придает 2-ю скорость);

- смена типа float на int ( (int)float ) ни на что не повлияло, думаю так же и сдругими типами, но думаю это экономит память, если статическую переменную хранить как int и нужно будет в будущем это число обрабатывать:
Код: Выделить всё
private static int resultF;
...
resultF = (int)Mathf.SmoothStep(0f, 360f, step);
vector3.z = trans.rotation.z + resultF;


весь тест проводился на 2-х спрайтах с использованием SpriteManager за 1 draw call в кол-ве 150 объектов:
- Update() = 25 fps
- коротина yiled return WaitForSecond(0.02) = 20 fps;
- коротина yiled return null = 20 fps;
- FixedUpdate() = 3 fps;

а вот и сам скрипт, идеальный пример как должно быть в случае замены FixedUpdate():

Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class SBRotation : MonoBehaviour
{
    private SBSpriteComponent thisObj;
    private Transform trans;
    private float step;
    private static float resultF;
    private static Vector3 vector3;
    private static WaitForSeconds waitSec = new WaitForSeconds(0.02f);

    void Start()
    {
        trans = gameObject.transform;
        StartCoroutine_Auto(StartAnimation());
    }

    IEnumerator StartAnimation()
    {
        while (true)
        {
            resultF = Mathf.SmoothStep(0f, 360f, step);
            step = Mathf.Repeat(step + 0.01f, 1);
            vector3.x = trans.rotation.x;
            vector3.y = trans.rotation.y;
            vector3.z = trans.rotation.z + resultF;
            trans.rotation = Quaternion.Euler(vector3);
            yield return waitSec;
        }
    }
}
 


ЗЫ: проверялось на iPhone 3G с возможностью фоновой работы приложений (backgrounder). при 100 объектах вообще все шикарно
Последний раз редактировалось jeyson 17 мар 2010, 12:18, всего редактировалось 3 раз(а).
Аватара пользователя
jeyson
UNIт
 
Сообщения: 113
Зарегистрирован: 15 апр 2009, 22:22
Откуда: Ижевск
  • ICQ

Re: Оптимизация

Сообщение Neodrop 17 мар 2010, 02:48

Этот скрипт висел на каждом объекте?
Попробуй то же самое, только с пропуском одного кадра. Не чисто While а с yield return null;
FPS падал не из-коратины, я думаю, а из-за того, что время её срабатывания попадает на время рендеринга. То есть, происходят "выпадения кадров".

Синтаксис:
Используется csharp
IEnumerator StartAnimation()
    {
        while (true)
        {
            resultF = Mathf.SmoothStep(0f, 360f, step);
            step = Mathf.Repeat(step + 0.01f, 1);
            vector3.x = trans.rotation.x;
            vector3.y = trans.rotation.y;
            vector3.z = trans.rotation.z + resultF;
            trans.rotation = Quaternion.Euler(vector3);
            yield return null;
        }
    }
 
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Оптимизация

Сообщение jeyson 17 мар 2010, 07:12

Да, на каждом объекте, и по поводу return null я написал: - коротина yiled return null = 20 fps; Но как выяснилось лучше вместо этого использовать Update(), а вот уже вместо FixedUpdate() - коротину с yiled return WaitForSeconds(0.02);

Следующий тест будет с одним скриптом-менеджером через Update(), который будет анимировать все 150 обжектов (если у кого-то есть сейчас время, проверьте плиз, а то до дома еще весь день)
Аватара пользователя
jeyson
UNIт
 
Сообщения: 113
Зарегистрирован: 15 апр 2009, 22:22
Откуда: Ижевск
  • ICQ

Re: Оптимизация

Сообщение Paul Siberdt 17 мар 2010, 10:13

Вот, малаццы... вот, харашо... давайте-давайте... читаю ваш бестселлер взахлеб ^:)^
Спасиб за наводку про акселерометр.

Кстати, от меня - заменяйте двусторонние шейдеры односторонними. Даже если отсутствуют ситуации рендера обеих сторон меша, отсутствие кулинга ощутимо тяжелее в скорости.

И новая версия Юнифоны сама мержит меши с одним материалом, как оказалось... :-o
Аватара пользователя
Paul Siberdt
Адепт
 
Сообщения: 5317
Зарегистрирован: 20 июн 2009, 21:24
Откуда: Moscow, Russia
Skype: siberdt
  • Сайт

Re: Оптимизация

Сообщение jeyson 17 мар 2010, 12:24

За шейдеры тоже надо будет взяться, спасибо что напомнил про двусторонность. А мержд мешов с одним материалом ты имеешь ввиду в 1.6? не знал, надо будет соптимизировать SpriteManager.
Аватара пользователя
jeyson
UNIт
 
Сообщения: 113
Зарегистрирован: 15 апр 2009, 22:22
Откуда: Ижевск
  • ICQ

Re: Оптимизация

Сообщение gnoblin 17 мар 2010, 12:32

- !!! НИКАКИХ !!! new (типа new Vectro3(x,y,z), new Rect()) в циклах и часто вызываемых местах!!!

Это значимый (value) тип, точно также как int и float - каким макаром это убивает производительность? :-w
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Оптимизация

Сообщение Paul Siberdt 17 мар 2010, 12:39

Да, в 1.6
Про мерж я ток вчера заметил... у меня вывалились элементы из мержящейся группы, а дравколов не прибавилось. Начал убивать один за другим объекты-клоны и оказалось, что они мержатся автоматом даж во вьюпорте редактора.

А как надеялся повысить производительность этими мержами :D
Аватара пользователя
Paul Siberdt
Адепт
 
Сообщения: 5317
Зарегистрирован: 20 июн 2009, 21:24
Откуда: Moscow, Russia
Skype: siberdt
  • Сайт

Re: Оптимизация

Сообщение jeyson 17 мар 2010, 12:49

gnoblin писал(а):
- !!! НИКАКИХ !!! new (типа new Vectro3(x,y,z), new Rect()) в циклах и часто вызываемых местах!!!

Это значимый (value) тип, точно также как int и float - каким макаром это убивает производительность? :-w

я думаю все же new создает новый объект каждый раз, из-за чего GC просто убивает все. Хотя надо еще раз будет убедиться по этому поводу, проверю сегодня. Хотя я не зря же сначала создал экземпляр new WaitForSecond(0.02), тк если его поместить в конец коротина yield return, то получим тормоза и дергания, что похоже на GC.
Аватара пользователя
jeyson
UNIт
 
Сообщения: 113
Зарегистрирован: 15 апр 2009, 22:22
Откуда: Ижевск
  • ICQ

Re: Оптимизация

Сообщение gnoblin 17 мар 2010, 14:30

Дерганье как раз из-за того что обновление происходит не каждый кадр (а с 0.2f задержкой).

Vector2, Vector3, Rect это СТРУКТУРЫ - их GC не видит ваще.
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Оптимизация

Сообщение Neodrop 17 мар 2010, 15:02

jeyson писал(а):Да, на каждом объекте, и по поводу return null я написал: - коротина yiled return null = 20 fps; Но как выяснилось лучше вместо этого использовать Update(), а вот уже вместо FixedUpdate() - коротину с yiled return WaitForSeconds(0.02);

Следующий тест будет с одним скриптом-менеджером через Update(), который будет анимировать все 150 обжектов (если у кого-то есть сейчас время, проверьте плиз, а то до дома еще весь день)


Тьфу. Я в коде не дописал вторую строку yield return null - я имею в виду расчёт проводить ЧЕРЕЗ кадр.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

След.

Вернуться в iPhone & Android

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

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