Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

В первом уроке Асинх.Python вынести read_controls из функции отрисовки корабля #67

Open
pelid opened this issue Dec 17, 2020 · 1 comment

Comments

@pelid
Copy link
Member

pelid commented Dec 17, 2020

Вызов 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]
Сначала запускаются все корутины, потом программа засыпает на секунду и только затем отрисовывает изменения на экране.
По идее должно быть наоборот

Vladislav Buldakov, [17.12.20 18:30]
Ой. Точно. Спасибо большое) Заработало

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]
Тогда будет видно мерцание корабля:

image

@pelid
Copy link
Member Author

pelid commented Dec 17, 2020

Можно решить багу выносом read_controls внутрь event loop, а нажатия кнопок передавать через глобальные переменные.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant