Проверка «задет ли слот» без пяти аргументов: минус 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:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user