Переворот: убрать перерисовку комнаты — стирать только запечённое пламя

Полная перерисовка (прошлый коммит) чинила лишние языки огня, но стоила
6 245 477 тактов = 14.5 кадра (замер MAME) против 2.1 кадра у копии
акселератором — пользователь увидел сильное подтормаживание на U, причём в
обе стороны.

Оказалось, чинить надо ровно одну вещь: пламя факела запекается в ОЗУ-копию
(pop_torch_draw — heal'а нет, следующий кадр непрозрачно накрывает
предыдущий), и отражение утаскивало его в зеркальную позицию, где накрывать
уже нечем.  Новая pop_torch_wipe(row,col) стирает запечённый кадр пламени и
возвращает фон покоя (bar + draw_tile своей ячейки и правого соседа —
канвас 16x18 в ячейке правого соседа, как в seg008:560).

pop_flip_screen снова отражает копией, но ПЕРЕД этим проходит 30 тайлов
комнаты и чистит факелы (коды 19 и 30) на обеих страницах.

Замер после правки: 904 247 тактов = 2.1 кадра — то есть чистка стоит ~7 000
тактов, а переворот вернулся к скорости копии (ускорение 6.9x против
перерисовки).  tests-host 6/6.
This commit is contained in:
2026-08-12 23:41:19 +03:00
parent 948d8f08f2
commit c9aa6d9c16
3 changed files with 61 additions and 25 deletions
+5
View File
@@ -128,6 +128,11 @@ void pop_chomp_redraw(int row, int col) __banked;
* modif — живой room_modif тайла. Для факела col — колонка САМОГО факела
* (пламя рисуется в ячейке правого соседа). */
void pop_torch_draw(int row, int col, uint8_t modif) __banked;
/* Стереть запечённое пламя факела с текущей draw-страницы (фон покоя).
* Нужно перевороту экрана: иначе отражение растаскивает языки огня по
* комнате — подробности в pop_room.c. */
void pop_torch_wipe(int row, int col) __banked;
void pop_potion_draw(int row, int col, uint8_t modif) __banked;
/* Ворота на ЛЕВОМ шве (col0) — перерисовать по живому modif соседа слева.