Скорость перемещение объекта вне зависимости от FPS

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

Скорость перемещение объекта вне зависимости от FPS

Сообщение Bio 20 май 2021, 10:57

Всем привет!
Проект на смартфоне в 2D, необходимо что бы за строго ограниченное время (2 минуты) игровой объект поменял позицию конкретное число раз. При высоком FPS всё идёт гладко, если же FPS падает ниже 30, то объект не успевает за это время совершить нужное кол-во смен позиции.
Смена позиции заложена в корутину, которая запускается в Start(), потом идёт цикл пока не выйдет установленное время. Есть пересечение с функцией смены цвета объекта, которая меняет цвет в зависимости от количество пройденных позиций.
Как можно сделать что бы кол-во смен позиций всегда было одинаково вне зависимости от FPS?

Таймер отчёта времени:
Синтаксис:
Используется csharp
   
    DateTime timerEnd;
    TimeSpan delta;
    Text gameTimer;

    void FixedUpdate()
    {
        Timer();    
    }

 void Timer()
    {
        if (delta.TotalSeconds >= 0)
        {
            delta = timerEnd - DateTime.Now;
            gameTimer.text = $"{delta.Minutes} : {delta.Seconds}"; //вывод таймера на экран
        }
        if (delta.TotalSeconds <= 0)
        {
            playGame = false; // конец игры
        }
    }
 

Пробовал запускать через Time.fixedDeltaTime
Синтаксис:
Используется csharp
                StartCoroutine(FlowerRespawn(TTLFlower * Time.fixedDeltaTime * 50)); // float TTLFlower - изменяет значение в зависимости от количество пройденных позиций
 

Пробовал так же переделать под функцию которую запускал в FixedUpdate().
Возможно ли вообще технически, то что я описал?
Bio
UNец
 
Сообщения: 4
Зарегистрирован: 20 май 2021, 10:33

Re: Скорость перемещение объекта вне зависимости от FPS

Сообщение 1max1 20 май 2021, 11:15

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

Re: Скорость перемещение объекта вне зависимости от FPS

Сообщение Bio 20 май 2021, 11:26

Не хотел его скидывать, ибо он большой и страшный)
Синтаксис:
Используется csharp
    private IEnumerator FlowerRespawn(float timer)
    {
        if (playGame)
        {
            if (!flower.GetComponent<Image>().enabled) flower.GetComponent<Image>().enabled = true;

            int rand = UnityEngine.Random.Range(0, pointPosition.Length);
            flower.transform.position = pointPosition[rand].position;
            if (nowPos == rand)
            {
                rand = UnityEngine.Random.Range(0, pointPosition.Length);
                flower.transform.position = pointPosition[rand].position;
                yield return new WaitForSeconds(0f);
            }
            nowPos = rand;
            yield return new WaitForSeconds(timer * Time.fixedDeltaTime * 50);

            Invoke("ColorChange", 0f); //Смена цвета, стоит через Invoke, ибо была изначально потребность в задержке и разовом вызове
        }
    }
 
Bio
UNец
 
Сообщения: 4
Зарегистрирован: 20 май 2021, 10:33

Re: Скорость перемещение объекта вне зависимости от FPS

Сообщение Jarico 20 май 2021, 12:11

время в FixedUpdate считай, и используй Time.fixedDeltaTime
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: Скорость перемещение объекта вне зависимости от FPS

Сообщение Bio 20 май 2021, 12:47

Jarico писал(а):время в FixedUpdate считай, и используй Time.fixedDeltaTime

Помогло фиксировать постоянное кол-во перемещений при одинаковом FPS, если FPS падает, то и кол-во перемещений тоже падает...
Цель, что бы кол-во перемещений вообще не менялось не зависимо от FPS
Bio
UNец
 
Сообщения: 4
Зарегистрирован: 20 май 2021, 10:33

Re: Скорость перемещение объекта вне зависимости от FPS

Сообщение 1max1 20 май 2021, 13:11

Что-то я цикла в твоей корутине не вижу, ты ее вызываешь 1 раз? Или как вообще это происходит? Что вообще происходит?! 8()
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Скорость перемещение объекта вне зависимости от FPS

Сообщение Bio 20 май 2021, 13:20

1max1 писал(а):Что-то я цикла в твоей корутине не вижу, ты ее вызываешь 1 раз? Или как вообще это происходит? Что вообще происходит?! 8()

Корутина повторно вызывается в функции ColorChange(). Там много условий по смене цвета и скорости вызова корутины
пример:
Синтаксис:
Используется csharp
            if (idFlower == 1) //Там много таких id. Указывает на то при каком числительном менять цвет
            {
                GetComponent<Image>().sprite = sprits[0];

                StopCoroutine(FlowerRespawn(TTLFlower * Time.fixedDeltaTime * 50));

                StartCoroutine(FlowerRespawn(TTLFlower * Time.fixedDeltaTime * 50));
            }
 

и по сути создаётся цикл: смена позиции -> смена цвета -> смена позиции...
Bio
UNец
 
Сообщения: 4
Зарегистрирован: 20 май 2021, 10:33

Re: Скорость перемещение объекта вне зависимости от FPS

Сообщение TeslaGan 20 май 2021, 13:34

1. попробуйте https://docs.unity3d.com/ScriptReferenc ... ltime.html
2. а имеет ли смысл вообще в добавлении Time.fixedDeltaTime? WaitForSeconds задает задержку. если у вас случился физ лаг, то следующий кадр после лага фикседДельта будет больше необходимого и у вас случится большая задержка в короутине.
3. смутили 2 строчки
Синтаксис:
Используется csharp
StartCoroutine(FlowerRespawn(TTLFlower * Time.fixedDeltaTime * 50));


Синтаксис:
Используется csharp
private IEnumerator FlowerRespawn(float timer)
{
 ....
yield return new WaitForSeconds(timer * Time.fixedDeltaTime * 50);

получается в вашей короутине вы 2 раза умножаете на * Time.fixedDeltaTime * 50?
TeslaGan
UNITрон
 
Сообщения: 315
Зарегистрирован: 01 авг 2015, 18:00

Re: Скорость перемещение объекта вне зависимости от FPS

Сообщение 1max1 20 май 2021, 13:35

Мде...
К слову, вот это не останавливает корутину:
StopCoroutine(FlowerRespawn(TTLFlower * Time.fixedDeltaTime * 50));

Это вообще константа бесполезная:
Time.fixedDeltaTime * 50

Читай справку про StopCoroutine, там есть примеры как нужно это делать.
В моем понимании у тебя должно быть что-то типа такого:
Синтаксис:
Используется csharp
    IEnumerator c_Change(Transform target, float time, int count, Vector3[] positions)
    {
        float delay = time / count;

        for (int i = 0; i < count; ++i)
        {
            int randomIndex = UnityEngine.Random.Range(0, positions.Length);

            target.position = positions[randomIndex];

            // Где-то тут можно и цвет поменять

            yield return new WaitForSeconds(delay);
        }
    }

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

Re: Скорость перемещение объекта вне зависимости от FPS

Сообщение Jarico 20 май 2021, 14:09

Bio писал(а):
Jarico писал(а):время в FixedUpdate считай, и используй Time.fixedDeltaTime

Помогло фиксировать постоянное кол-во перемещений при одинаковом FPS, если FPS падает, то и кол-во перемещений тоже падает...
Цель, что бы кол-во перемещений вообще не менялось не зависимо от FPS


Движок однопоточный и зависим от времени кадра, поэтому цель недостигаема... Оптимизируй и ограничивай фпс до стабильного
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
  • Сайт


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

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

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