Comments 14
Спасибо за статью. Как раз искал нечто подобное.
Стоило бы рассказать в чем плюсы и минусы корутин в сравнении с тредами.
Уместнее было бы сравнивать корутины с выполнением ваших задач в методе Update (тут всё просто, корутины проще читать, легко понимать и не обязательно выполнять в каждом фрейме). Юнити не без причины работает с вашим кодом в одном потоке, а Unity api не работает асинхронно. Конечно, вы можете использовать свои потоки для некоторых вычислений не связанных непосредственно с юнити, но это уже совсем другая история.
Я сам с этим столкнулся, и пока разбирался в теме, то видел один и тот же вопрос — люди не понимают, что корутины однопоточны. И что для асинхронности и повышения скорости нужны как раз треды, а не корутины. И у тредов свои минусы. Потому и предложил отдельно отметить, новичку это будет неочевидно.
О, как я намаялся, выковыривая апи юнити из кода генерации ландшафта, когда до меня дошло, что волшебное StartCoroutine работает в том же потоке =)
Все-таки как-то запутанно все с корутинами и потоками. Я тот самый классический новичек. В статье я вижу:
В комментарии:
Так где же истина?
Корутины (Coroutines, сопрограммы) в Unity — простой и удобный способ запускать функции, которые должны работать параллельно в течение некоторого времени.
В комментарии:
Юнити не без причины работает с вашим кодом в одном потоке, а Unity api не работает асинхронно.
Так где же истина?
Чуть ниже в статье я уточнил, что параллельно != асинхнонно. Мне тоже слово «параллельно» показалось довольно шатким в контексте С#, но в контексте Юнити, видимый процесс работы группы корутин вполне можно назвать параллельным.
Если коротко, истина в том, что корутина к потокам отношения не имеет, вызов Unity api в ваших, вручную созданных потоках, невозможен, а свои потоки вы можете использовать для работы, не связанной напрямую с изменением состояния игровых объектов. Конечно, вы можете работать со статическими функциями Юнити в своих потоках (например, использовать класс Mathf для своих вычислений).
Этой информации должно быть достаточно для работы с корутинами, а для тех, кому хочется копнуть поглубже, готовлю отдельную статью. Спасибо :)
Если коротко, истина в том, что корутина к потокам отношения не имеет, вызов Unity api в ваших, вручную созданных потоках, невозможен, а свои потоки вы можете использовать для работы, не связанной напрямую с изменением состояния игровых объектов. Конечно, вы можете работать со статическими функциями Юнити в своих потоках (например, использовать класс Mathf для своих вычислений).
Этой информации должно быть достаточно для работы с корутинами, а для тех, кому хочется копнуть поглубже, готовлю отдельную статью. Спасибо :)
Забыли скобку закрыть и точку с запятой поставить в методе:
IEnumetaror PerformMovingCoroutine() {
// в Array.ForEach(…
}
IEnumetaror PerformMovingCoroutine() {
// в Array.ForEach(…
}
Вместо yield return break полагаю должен быть yield break.
Sign up to leave a comment.
Работа с Корутинами в Unity