LittleBob
@LittleBob

Как избежать зависания во время выполнения огромного цикла for?

При нажатии на кнопку у меня начинает работу огромный цикл for (десятки миллионов итераций)
Из-за этого игра виснет секунд на 20.
Юнити не поддерживает многопоточность C#, поэтому с потоком ничего не работает.
Пробовал с помощью корутины и выбрасывания yield return null после каждой итерации, но таким образом цикл завершится через очень продолжительное время.
Мне нужно избежать зависания, чтобы игрок не подумал о том, что игра вылетела/зависла. Хотелось бы как-то обновлять UI после каждой итерации, например увеличивать ProgressBar.
Как такое сделать?
  • Вопрос задан
  • 86 просмотров
Решения вопроса 1
@Ezekiel4
Охотник на пиратов и сборщик монолитов
Так или иначе, вам придётся делать задачу в фоне. Если одна корутина работает долго, разбейте задачу на несколько корутин, каждой делегируйте свою часть. Если принципиально важно всё делать в один поток, делайте работу до вызова результата и сохраните в кэш, после просто показав результат.

Если данные варианты вам не подходят и вы хотите обойтись прогрессбаром, то разбейте задачу на шаги, в вашем случае шаги итерации, и после завершения каждого добавляйте +1/к-во шагов к величине прогресса, просто вызывая это в конце блока цикла.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы