Баг или особенность yield?

Общие вопросы о Unity3D

Баг или особенность yield?

Сообщение Paul Siberdt 27 янв 2011, 02:44

Собственно, натолкнулся на неприятную, как оказалось для меня, штуку:

yield WaitForSeconds(0.0) отжирает на себя один кадр.

Проверка:
...
Синтаксис:
Используется javascript
TestYield( 0.0 );
print("Next Line");
...

function TestYield ( _waitTime : float ) {
//      if (_waitTime)  // раскомментите IF и все заработает по порядку
                yield WaitForSeconds( _waitTime );
        print("Test Yield");
}


Результат:
Next Line
Test Yield

тогда как правильно должно быть:
Test Yield
Next Line


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

Re: Баг или особенность yield?

Сообщение Neodrop 27 янв 2011, 04:09

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

Re: Баг или особенность yield?

Сообщение Paul Siberdt 27 янв 2011, 04:51

Скажем, у меня есть функция, которая обрабатывает разные типы кнопок. В одном случае необходима задержка между операциями, в другом - задержка не нужна.

ResetButton(buttonIndex,animation["active"].length); // здесь мы ждем, пока проиграется анимация кнопки.

root.BroadcastMessage ("ResetButton",15); // а здесь мы сразу же сбрасываем состояние всех кнопок с индексом 15.

Да, я подозреваю, что yield запускает свои коротиновские механизмы, потому не до конца был уверен в том, что здесь кроится баг. Но логика-то присуствует в желании мгновенного срабатывания с ожиданием 0.0 секунд, можно же в коротину вставить начальную проверку. :) Посмотрим. как отпишутся юнитеки на репорт.

Поправить ситуацию просто, или оператором if или дополнительной yield после вызова функции. Однако, проблема свалилась как снег на голову, отказала треть кнопок, перестали срабатывать, потому что сброс группы кнопок происходил позже активации выбранной именно из-за сожранного кадра.

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

Re: Баг или особенность yield?

Сообщение gnoblin 27 янв 2011, 07:03

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

Re: Баг или особенность yield?

Сообщение Paul Siberdt 27 янв 2011, 11:52

Асинхронный-то он асинхронный, но вот получается, что скорость срабатывания такая, включая скорость срабатывания на афйоне :) ... конечно, можно подстраховаться еще одним yield-ом. (Это я про бродкаст)

А сжирание кадра в yield WaitForSeconds(0) происходило одинаково, вне зависимости от способа вызова функции с "не ожиданием".
Аватара пользователя
Paul Siberdt
Адепт
 
Сообщения: 5317
Зарегистрирован: 20 июн 2009, 21:24
Откуда: Moscow, Russia
Skype: siberdt
  • Сайт


Вернуться в Общие вопросы

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

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