Embel & SnapFitSoul
SnapFitSoul SnapFitSoul
Интересно, а ты когда-нибудь думал, как бы втиснуть весь игровой цикл в один поток, чтобы кадровая частота не проседала? Я тут кое-что набросала, как упростить очередь событий, но запуталась в этой разветвлённой логике. Как думаешь, как лучше разбивать эту сложность?
Embel Embel
Можно каждую итерацию цикла привязать к состоянию и использовать простой конечный автомат. Так ветвления будут простыми if-else, а не запутанным древом. Только будь осторожен с блокирующими вызовами – если обработчик события ждёт ввода/вывода, заблокируется вся цепочка. Лучше выполнять их в отдельных потоках или преобразовать в колбэки, тогда цикл будет работать быстро.
SnapFitSoul SnapFitSoul
Звучит неплохо, но с автоматами состояний можно легко запутаться, если не соблюдать осторожность. Ты продумал все переходы между состояниями и убедился, что ни одно событие не ускользнет, что потребует полного перебора очереди? И не забывай, чтобы I/O колбэки были строго асинхронными – один блокирующий вызов и ты почувствуешь, как всё зависнет. Если нужна быстрая проверка диаграммы состояний, дай знать.
Embel Embel
Сейчас пробегусь по схеме и проверю все переходы. Если где-то потребуется последовательный просмотр, отмечу это и перепишу этот участок, чтобы использовать быстрый поиск. Также проверю пути ввода-вывода, чтобы убедиться, что все обратные вызовы асинхронные или не блокируют основной поток. Дай мне минутку, сейчас отправлю обновленную версию.
SnapFitSoul SnapFitSoul
Это верное решение – подтянув эти переходы, ты сделаешь цикл более оптимальным. Следи за любыми незапланированными синхронными вызовами, которые могут проскочить, и у тебя получится чистый и эффективный конечный автомат в мгновение ока. Пришли, когда будешь готов, мы быстро глянем.
Embel Embel
Вот обновлённая схема состояний. Я убрал лишние переходы, заменил синхронный ввод-вывод на промисы и добавил условие, чтобы избежать полных сканирований. Посмотри, как тебе.
SnapFitSoul SnapFitSoul
Выглядит хорошо, только пара моментов стоит проверить: убедись, что каждый охранник действительно блокирует дорогое сканирование, и что цепочки обещаний не создают скрытых микрозадач, которые могут изменить порядок выполнения. В остальном — чистый, линейный поток. Отличная работа.
Embel Embel
Спасибо, сейчас запущу полный тест, чтобы убедиться, что каждый страж блокирует сканирование, и проверю цепочки обещаний на предмет скрытых микрозадач. Пройдусь еще раз, чтобы ничего не пропустил. Скажи, если что-то упустил.
SnapFitSoul SnapFitSoul
Звучит отлично – просто будь начеку, чтобы не было ошибок в обработке крайних случаев, когда страж может сработать некорректно. Если произойдет ситуация, когда промис разрешится до проверки стража, то сканирование может снова проскользнуть. Сообщи мне, когда тесты пройдут, и мы отметим любые остаточные аномалии.