Корутины работают медленно

Программирование на Юнити.

Корутины работают медленно

Сообщение triska 03 апр 2020, 19:07

Есть код:
Синтаксис:
Используется csharp
private IEnumerator OnL() {
    WaitForSeconds secE = new WaitForSeconds(0.01f),
                   secF = new WaitForSeconds(0.5f);
    while (h.e < this.e) {
        h.e += 0.2f;
        yield return secE;
    }
    while (h.f < this.f) {
        h.f += 0.2f;
        yield return secF;
    }
}

Происходит проблема на мобиле, выражается она тем, что она медленно начинает работать.
На компе, она буквально за пол секунды увеличивает значения.
А на мобиле, это секунд за 5, а то и больше, почему так происходит?
Данный метод активируется через метод:

Синтаксис:
Используется csharp
public void OnS() {
    StartCoroutine(OnL());
}


А этот метод запускается по кнопке, ведь ничего сложного нет в этих методах, а почему такая огромная разница и как с этим бороться?
Возможно FPS проседает, но тут Update не используется, все срабатывает в циклах.
Как быть в такой ситуации и как это исправить?

Знатоки выручайте!
Уже 3 день не могу разобраться никак.
triska
UNIт
 
Сообщения: 64
Зарегистрирован: 08 фев 2020, 09:42

Re: Корутины работают медленно

Сообщение Jarico 03 апр 2020, 19:16

Из Хабра
Корутины представляют собой простые C# итераторы, возвращающие IEnumerator и использующие ключевое слово yield. В Unity корутины регистрируются и выполняются до первого yield с помощью метода StartCoroutine. Дальше Unity опрашивает зарегистрированные корутины после каждого вызова Update и перед вызовом LateUpdate, определяя по возвращаемому в yield значению, когда нужно переходить к следующему блоку кода.


Возможно у тебя FPS как-то ограничен (см. Quality Settings -> VSync Count)

Don't Sync - снимает ограничение FPS
Every V Blank - ограничивает FPS до 60
Every Second V Blank - ограничивает FPS до 30
Github: _https://github.com/redheadgektor
Discord: Конь! Чаю!#9382 (сижу редко)
YouTube: _https://www.youtube.com/channel/UCPQ04Xpbbw2uGc1gsZtO3HQ
Telegram: _https://t.me/redheadgektor
Аватара пользователя
Jarico
Адепт
 
Сообщения: 1084
Зарегистрирован: 06 янв 2019, 17:37
Откуда: 0xDEAD
Skype: none
  • Сайт

Re: Корутины работают медленно

Сообщение triska 03 апр 2020, 19:41

Jarico писал(а):Из Хабра
Корутины представляют собой простые C# итераторы, возвращающие IEnumerator и использующие ключевое слово yield. В Unity корутины регистрируются и выполняются до первого yield с помощью метода StartCoroutine. Дальше Unity опрашивает зарегистрированные корутины после каждого вызова Update и перед вызовом LateUpdate, определяя по возвращаемому в yield значению, когда нужно переходить к следующему блоку кода.


Возможно у тебя FPS как-то ограничен (см. Quality Settings -> VSync Count)

Don't Sync - снимает ограничение FPS
Every V Blank - ограничивает FPS до 60
Every Second V Blank - ограничивает FPS до 30


У меня VSync отключен. То есть стоит Don't Sync.
triska
UNIт
 
Сообщения: 64
Зарегистрирован: 08 фев 2020, 09:42

Re: Корутины работают медленно

Сообщение 1max1 03 апр 2020, 20:20

Time.timeScale нигде не меняешь?
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Корутины работают медленно

Сообщение triska 03 апр 2020, 20:49

1max1 писал(а):Time.timeScale нигде не меняешь?

Меняю когда в меню захожу, меняю на 0, но потом возобновляю на 1.
А как это мешает?
triska
UNIт
 
Сообщения: 64
Зарегистрирован: 08 фев 2020, 09:42

Re: Корутины работают медленно

Сообщение 1max1 03 апр 2020, 21:09

WaitForSeconds зависит от таймСкейла, используй тогда WaitForSecondsRealtime. Хотя если ты говоришь что на пк всё ок... хз-хз.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Корутины работают медленно

Сообщение triska 03 апр 2020, 21:14

1max1 писал(а):WaitForSeconds зависит от таймСкейла, используй тогда WaitForSecondsRealtime. Хотя если ты говоришь что на пк всё ок... хз-хз.

Ради теста, сейчас вообще убрал задержку поставил null, все также и осталось, ничего не изменилось, по прежнему тормознуто работает.
На компе вообще моментально, а на мобиле медленно.

К тому-же тайм скейл меняю только по кнопке, а если ее не жать, то скейл не меняется.

На компе FPS 600 - 800.
triska
UNIт
 
Сообщения: 64
Зарегистрирован: 08 фев 2020, 09:42

Re: Корутины работают медленно

Сообщение mastersmit 03 апр 2020, 22:34

Как то сталкивался давным давно с тем, что корутина медленно работает, но только при условии если WaitForSeconds меньше 0.1 вроде. То есть, на пк разница между 0.1 и 0.01 есть, а на мобиле нет.. С нулом одинаково.
А в твоём случае, если null, то конечно на пк будет быстрее, у тебя фпс дофига, вот цикл корутины за секунду и пройдёт 800 раз, а на Андроиде заблокировано частотой экрана..
Аватара пользователя
mastersmit
Старожил
 
Сообщения: 558
Зарегистрирован: 12 май 2014, 14:05
Откуда: Приморский край

Re: Корутины работают медленно

Сообщение triska 04 апр 2020, 07:27

Теперь возникла еще другая проблема...
Хрен с ней с этой корутиной, терпит.

Тут пришла другая проблема.

Синтаксис:
Используется csharp
public class Anim : MonoBehaviour {
    public enum Axis {
        X,
        Y,
        Z
    }
    public bool InverceRotate = false;
    public Axis RotateAxis;
    private Transform Trans;
    private float RotateDegree,
                  Speed;
    private Vector3 OriginalRotate;
    public void SetSpeed(float value) => Speed = Mathf.Clamp(value, 0, 3000);
    private void Start() {
        Trans = transform;
        OriginalRotate = Trans.localEulerAngles;
    }
    private void Update() {
        if (InverceRotate) {
            RotateDegree -= Speed * Time.deltaTime;
        } else {
            RotateDegree += Speed * Time.deltaTime;
        }
        RotateDegree %= 360;
        switch (RotateAxis) {
            case Axis.Y:
                Trans.localRotation = Quaternion.Euler(OriginalRotate.x, RotateDegree, OriginalRotate.z);
                break;
            case Axis.Z:
                Trans.localRotation = Quaternion.Euler(OriginalRotate.x, OriginalRotate.y, RotateDegree);
                break;
            default:
                Trans.localRotation = Quaternion.Euler(RotateDegree, OriginalRotate.y, OriginalRotate.z);
                break;
        }
    }
}


Вот использую код для анимации колеса, все как не странно работает, но как только я начинаю приближаться к лесу к примеру, где деревьев масса, ничего не тупит, лагов нет, но начинает замедляться колесо.
Это прям видно.
И раздражает.
Чуть отдаляюсь, ускоряется, опять приближаюсь, замедляется, что за дела?
Как это исправить?
Пробовал через FixedUpdate и Time.fixedDeltaTime тоже самое.
triska
UNIт
 
Сообщения: 64
Зарегистрирован: 08 фев 2020, 09:42

Re: Корутины работают медленно

Сообщение triska 06 апр 2020, 05:07

Не знаю, что была за херня, но я добавил Vulcan к OpenGL ES и перестал этот глюк с торможением анимации.
Ко всему еще сделал ограничения в 60 FPS через VSync и прошли фризы и дерганья камеры.
Странный какой-то глюк был.

Вообще странная какая-то Unity.
triska
UNIт
 
Сообщения: 64
Зарегистрирован: 08 фев 2020, 09:42

Re: Корутины работают медленно

Сообщение Jarico 06 апр 2020, 09:13

triska писал(а):Вообще странная какая-то Unity.



Странности видимо у тебя были, я тестил короутины на своем кирпичике и все нормально было...
Github: _https://github.com/redheadgektor
Discord: Конь! Чаю!#9382 (сижу редко)
YouTube: _https://www.youtube.com/channel/UCPQ04Xpbbw2uGc1gsZtO3HQ
Telegram: _https://t.me/redheadgektor
Аватара пользователя
Jarico
Адепт
 
Сообщения: 1084
Зарегистрирован: 06 янв 2019, 17:37
Откуда: 0xDEAD
Skype: none
  • Сайт

Re: Корутины работают медленно

Сообщение triska 06 апр 2020, 11:49

Jarico писал(а):Странности видимо у тебя были, я тестил короутины на своем кирпичике и все нормально было...

Какие странности у меня?
Пальцем в небо тыкаете.
Что вы там тестили, свистаперделку с пустой сценой?
Сделайте реальный проект, если конечно вообще сможете и посмотрите, как работают корутины, когда у вас фпс просядет.
У меня сцена минимум 300 - 500 к трисов.
triska
UNIт
 
Сообщения: 64
Зарегистрирован: 08 фев 2020, 09:42

Re: Корутины работают медленно

Сообщение Jarico 06 апр 2020, 12:50

triska писал(а):Какие странности у меня?

Странность в твоём "проекте"... У тебя проект явно имеет говно код а ты жалуешься на медленную работу

triska писал(а):если конечно вообще сможете и посмотрите, как работают корутины, когда у вас фпс просядет.

При правильном их использовании всё нормально работает, и на всех устройствах...

Я тебе писал что корутины зависят от количества кадров в секунду...
Jarico писал(а):Из Хабра
Корутины представляют собой простые C# итераторы, возвращающие IEnumerator и использующие ключевое слово yield. В Unity корутины регистрируются и выполняются до первого yield с помощью метода StartCoroutine. Дальше Unity опрашивает зарегистрированные корутины после каждого вызова Update и перед вызовом LateUpdate, определяя по возвращаемому в yield значению, когда нужно переходить к следующему блоку кода.


triska писал(а):Что вы там тестили, свистаперделку с пустой сценой?

Свистоперделка со сценой где 39 игроков скачут и у каждого обновления 64 раза в секунду
Github: _https://github.com/redheadgektor
Discord: Конь! Чаю!#9382 (сижу редко)
YouTube: _https://www.youtube.com/channel/UCPQ04Xpbbw2uGc1gsZtO3HQ
Telegram: _https://t.me/redheadgektor
Аватара пользователя
Jarico
Адепт
 
Сообщения: 1084
Зарегистрирован: 06 янв 2019, 17:37
Откуда: 0xDEAD
Skype: none
  • Сайт

Re: Корутины работают медленно

Сообщение triska 06 апр 2020, 12:59

Jarico писал(а):Странность в твоём "проекте"... У тебя проект явно имеет говно код а ты жалуешься на медленную работу

Да ты прям телепат, стихоплет, ты мой код видел? Херь несешь.
Jarico писал(а):При правильном их использовании всё нормально работает, и на всех устройствах...

Ну давай-ка покажи-ка, правильное использование. Или слабо?
Jarico писал(а):Я тебе писал что корутины зависят от количества кадров в секунду...

Прям противоречишь сам себе.
Jarico писал(а):Свистоперделка со сценой где 39 игроков скачут и у каждого обновления 64 раза в секунду

Самая натуральная свистаперделка.
triska
UNIт
 
Сообщения: 64
Зарегистрирован: 08 фев 2020, 09:42

Re: Корутины работают медленно

Сообщение Alex5 06 апр 2020, 13:08

О чём тут можно вообще спорить? Если кто-то считает, что "корутины работают медленно", то лучше написать и выложить простейший пример, доказывающий это. Иначе тезис о "г-коде" остаётся суровой правдой жизни. :)
Лично я вообще не считаю, что корутины, при правильном использовании, что-то там тормозят. Они ведь не волшебные. имхо.
Linux это просто
Экономика это просто
Forex это просто
Мой канал на YouTube
Аватара пользователя
Alex5
Старожил
 
Сообщения: 507
Зарегистрирован: 22 авг 2019, 17:37

След.

Вернуться в Скрипты

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

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