Coroutines при низком fps

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

Coroutines при низком fps

Сообщение getAlex 05 фев 2016, 22:23

Создаю в coroutines обычный куб из кубов через промежуток времени (просто для теста). Однако если фпс падает на определённых этапах до нуля, то некоторые кубы не создаются. Их создание как бы пропускается и переходит к следующему элементу инстанса. В итоге получается не куб, а сыр. Как гарантировать выполнение операции короутины? Если бы была WWW форма, то можно было бы проверить состояние загрузки, размер, ошибки и прочее - isDone, короче. Но как проверить выполнена ли обычная операция UnityEngin-a?
Может нужно не время ставить, а рекурсию без ветвления -проверять готово ли действие и запускать короутину снова, пока все элементы не будут созданы?
getAlex
Адепт
 
Сообщения: 1775
Зарегистрирован: 10 авг 2013, 18:30

Re: Coroutines при низком fps

Сообщение waruiyume 05 фев 2016, 22:28

Пример кода в студию! У меня ничего похожего не бывало.
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Coroutines при низком fps

Сообщение getAlex 05 фев 2016, 23:34

Оу, глянул, там не по времени, а WaitForEndOfFrame()
Но всё же - разве он должен пропускать создание при падении фпс?
Синтаксис:
Используется csharp
IEnumerator PlaceTest()
        {
                for(int i = 0; i<size_y; i++)
                {
                        for(int j = 0; j<size_z; j++)
                        {
                                for(int k = 0; k<size_x; k++)
                                {
                                        Instantiate...
                                        Initialization...
                                }      
                                yield return new WaitForEndOfFrame();
                        }
                }
        }

Сперва создаёт нормально, но подходя к 10к кубов, карта уже не может тянуть столько геометрии. И когда падает сильно фпс, короутина начинает заикаться и не всегда создаёт кубы. Говорю сразу, что это не нубская попытка сделать псевдо воксельную карту, а просто тест. Вопрос лишь в том, почему короутина не гарантирует выполнение операции.
getAlex
Адепт
 
Сообщения: 1775
Зарегистрирован: 10 авг 2013, 18:30

Re: Coroutines при низком fps

Сообщение waruiyume 06 фев 2016, 00:26

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

public class Test : MonoBehaviour
{
    private int size_y = 100;
    private int size_z = 100;
    private int size_x = 100;

    public int numberOfCopies;

    public void Start ()
    {
        StartCoroutine(PlaceTest());
    }


    IEnumerator PlaceTest()
    {
        numberOfCopies = 0;

        for (int i = 0; i < size_y; i++)
        {
            for (int j = 0; j < size_z; j++)
            {
                for (int k = 0; k < size_x; k++)
                {
                    GameObject.CreatePrimitive(PrimitiveType.Cube).GetComponent<Transform>().position = new Vector3(i, j, k);
                    ++numberOfCopies;
                }
                yield return new WaitForEndOfFrame();
            }
        }
    }
}
 


Где сыр?
Скрытый текст:
2016-02-06 00-21-47 Скриншот экрана.png
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Coroutines при низком fps

Сообщение getAlex 06 фев 2016, 01:55

Перезапустил юнити. Теперь всё нормально. Видимо, какой-то лаг.
Фух, а то я уже было подумал что короутина не надёжна и уже мысленно вычёркивал её из словаря.
getAlex
Адепт
 
Сообщения: 1775
Зарегистрирован: 10 авг 2013, 18:30

Re: Coroutines при низком fps

Сообщение waruiyume 06 фев 2016, 02:08

Вангую: положение блоков было как-то привязано ко времени- вот вам и сыр.
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Coroutines при низком fps

Сообщение getAlex 06 фев 2016, 02:37

waruiyume писал(а):Вангую: положение блоков было как-то привязано ко времени- вот вам и сыр.

Нет, положение блоков было привязано к итераторам и больше не к чему. И положение роли не играет т.к. пропавших с куба мелких кубов не было на сцене вообще. И не было вообще никакого функционала, препятствующего созданию кубов, в том числе и не было функционала удаляющего кубы. Просто приложение ушло в "не отвечает" или в 0 фпс на пару сек, а когда отвисло - пропустило создание нескольких кубов. С паузой самого эдитора тоже были подобные лаги. На каждом мелком кубе куча тяжелой логики, но она математическая и не затрагивает объекты.
getAlex
Адепт
 
Сообщения: 1775
Зарегистрирован: 10 авг 2013, 18:30

Re: Coroutines при низком fps

Сообщение waruiyume 06 фев 2016, 03:26

пропавших с куба мелких кубов не было на сцене вообще

Каким образом это было установлено, может они слиплись с другими?
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Coroutines при низком fps

Сообщение getAlex 06 фев 2016, 03:59

waruiyume писал(а):
пропавших с куба мелких кубов не было на сцене вообще

Каким образом это было установлено, может они слиплись с другими?

Их имена соответствовали их порядку создания. Достаточно было выделить куб, соседствующий с пропавшим и в поиске сцены набрать соседний элемент. Кроме того, после я проверял другим методом и число объектов на сцене было меньше планируемого.
getAlex
Адепт
 
Сообщения: 1775
Зарегистрирован: 10 авг 2013, 18:30


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

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

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