You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Вызов read_controls дёргает canvas.getch, а тот внезапно обновляет экран и работает как лишний вызов refresh. Из-за случаются разные баги:
отрисовка корабля внутри def animate_spaceship внезапно влияет на другие корутины
сам корабль мерцает при запуске в Repl.it из-за лишних canvas.refresh()
если в event loop перепутать местами time.sleep(…) и canvas.refresh(), то корабль вообще пропадёт с экрана и выяснить в что вообще случилось будет тяжело
Ниже переписка с Владиславом, он сообщил о проблеме:
Vladislav Buldakov, [17.12.20 17:17]
Добрый день. У меня вопрос по вашему ревью. Делаю урок 1 в модуле про асинхронный питон.
Настройка canvas.nodelay(True) включена, но
get_ship_coordinates(а точнее функция canvas.getch() в ней) дает задержку при отрисовке, если я вставляю его перед draw_frame. И корабль дергается, не прорисовывается до конца.
Если поставить функцию get_ship_coordinates после draw_frame, перед await то все отрисовывается хорошо.
Evgeny Evseev, [17.12.20 18:12]
Добрый день. Странная бага, раньше с такой не сталкивался или не замечал. Сейчас потестирую.
Evgeny Evseev, [17.12.20 18:22]
Проблема воспроизводится на локальной машине. Значит, дело в самописном коде.
Vladislav Buldakov, [17.12.20 18:24]
Я же использую готовую функцию get_ship_coordinates, ничего в ней не менял. Без нее все хорошо работает, если ее вставить то появляется лаг
Evgeny Evseev, [17.12.20 18:28]
Проблема в event loop:
time.sleep(settings.TIC_RATE)
canvas.refresh()
Evgeny Evseev, [17.12.20 18:29]
Сначала запускаются все корутины, потом программа засыпает на секунду и только затем отрисовывает изменения на экране.
По идее должно быть наоборот
Evgeny Evseev, [17.12.20 18:37]
Понял в чём дело. getch под капотом вызывает тот же refresh. Получается, что на долю секунды корабль отрисовывается, но затем сразу следует вызов getch, который обновляет экран и затирает корабль
Evgeny Evseev, [17.12.20 18:37]
Вот так можно дописать event loop:
curses_tools.draw_frame(canvas, 1, 1, str(_))
time.sleep(1)
canvas.refresh()
time.sleep(1)
Evgeny Evseev, [17.12.20 18:37]
Тогда будет видно мерцание корабля:
The text was updated successfully, but these errors were encountered:
Вызов
read_controls
дёргаетcanvas.getch
, а тот внезапно обновляет экран и работает как лишний вызовrefresh
. Из-за случаются разные баги:def animate_spaceship
внезапно влияет на другие корутиныcanvas.refresh()
time.sleep(…)
иcanvas.refresh()
, то корабль вообще пропадёт с экрана и выяснить в что вообще случилось будет тяжелоНиже переписка с Владиславом, он сообщил о проблеме:
The text was updated successfully, but these errors were encountered: