Проверка «задет ли слот» без пяти аргументов: минус 3 684

pop_cd_hit принимает (p, x0, y0, x1, y1) — три последних идут стеком, и
функция целиком уезжает в IX-фрейм: 45 % её тактов на `-n(ix)` (asm).
А зовут её из cd_quiet до восьми раз за кадр.

Новый pop_cd_hit_slot(who, p) берёт координаты прямо из pop_cd, а само
сравнение вынесено в hit_rect с file-scope аргументами.  Первая попытка —
обёртка, которая внутри всё равно звала pop_cd_hit — не дала ничего
(1799 Z80 вместо 1318, то есть стало хуже), и это записано здесь, чтобы
не повторять: снимать аргументы со стека нужно у ТОГО, кто их читает.

asm на путь «спрайт + накладной»: было 1799 + 2x1318 = 4435 тактов Z80,
стало 1221 + 2x1009 = 3239 (-27 %).

Замер 11/15, лёгкая позиция: синяя 219 894 -> 218 052, циан 41 280 ->
39 438, работа кадра 442 662 -> 438 978.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-19 16:56:50 +03:00
parent f47d79ded8
commit e501982457
3 changed files with 50 additions and 11 deletions
+3
View File
@@ -129,6 +129,9 @@ extern uint8_t pop_cd_ymin[2][10], pop_cd_ymax[2][10];
/* Задели ли прямоугольник (ЭКРАННЫЕ координаты, x1/y1 включительно) то,
* что трогали на странице p. Резидент (pop_tile.c). */
uint8_t pop_cd_hit(uint8_t p, int x0, int y0, int x1, int y1);
/* То же для СЛОТА персонажа: спрайт и накладной, координаты изнутри pop_cd
* (см. тело — там про цену пяти аргументов). */
uint8_t pop_cd_hit_slot(uint8_t who, uint8_t p);
void pop_cd_clear(uint8_t p); /* снять метку страницы целиком */
void pop_cd_init(void); /* пустые диапазоны на обеих страницах */
void pop_cd_touch(int x, int y, int w, int h);