Переворот: убрать перерисовку комнаты — стирать только запечённое пламя
Полная перерисовка (прошлый коммит) чинила лишние языки огня, но стоила 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:
@@ -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 соседа слева.
|
||||
|
||||
Reference in New Issue
Block a user