Разбор P14: он сводится к P4 (цене блита)

Fore-проход Кида в тяжёлой позиции (89 268) разложен зондами:

  вход + set_clip + char_footprint   10 872
  арифметика границ окна              3 786
  шов ворот + overlay-цикл            3 294
  ЦИКЛ fore_tile ПО ТАЙЛАМ           67 854   76 %
  gate_over_char + хвост              3 462

Счётчик показал, что цикл обходит ВСЕГО 4 тайла, и 3 из них реально
рисуют.  То есть 67 854 — не перебор лишних тайлов и не проверки, а цена
самих блитов переднего слоя: около четырёх блитов по ~16 000, где 6 765
на каждом — фиксированная накладная.

Значит отдельной оптимизации fore-прохода почти нет: срезать можно цену
блита (P4, ~27 000 из 67 854), char_footprint из физики (P10) и слияние
двух трамплинов в банк 2 (~4 000).

P4 поднят в очереди: он бьёт и по fore-проходу (4 блита), и по зелёной
фазе (8 блитов) — то есть работает и в динамике, и в статике.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-19 17:29:19 +03:00
parent 952879e7fa
commit 6f077b0d6d
3 changed files with 38 additions and 7 deletions
-5
View File
@@ -532,7 +532,6 @@ void pop_char_draw(uint8_t who) __banked
* сдвинул. Здесь прошлый кадр уже точно надо стереть. Если heal в этом
* кадре был, вызов бесплатен: valid/ovalid уже сняты. */
cd_heal(who);
pop_dbg_b1(); /* ЗАМЕР: cd_heal сделан */
s->cw = 0; /* окно fore-клипа: пусто, пока не нарисовали */
s->fpw = 0; /* габарит кадра: нечего перекрывать */
@@ -663,9 +662,7 @@ void pop_char_draw(uint8_t who) __banked
* так что «убрать последние bcut строк вывода» = «не рисовать
* первые bcut строк оригинала», а это ровно то, что просит
* clip_char. */
pop_dbg_b2(); /* ЗАМЕР: кадр загружен, геометрия готова */
ct = pop_clip_char_top(fp_x, obj_y, w, h);
pop_dbg_b3(); /* ЗАМЕР: clip_char_top (трамплин банк 4->3) */
if (!pop_upside) {
if (ct > top) {
skip = ct - top;
@@ -723,7 +720,6 @@ void pop_char_draw(uint8_t who) __banked
(uint8_t)(vis_w == w ? 0 : vis_w));
} else rows = 0;
gfx_set_bank(GFX_BANK_NORMAL);
pop_dbg_b4(); /* ЗАМЕР: спрайт выведен */
/* heal чистит ТОЛЬКО нарисованное: иначе стирается кромка пола над
* срезом (мусор/дыра в кладке на второй странице дабл-буфера). */
s->x[dp] = bx + lskip; s->y[dp] = top;
@@ -757,7 +753,6 @@ void pop_char_draw(uint8_t who) __banked
* между ними (BUG-CHAR-STALE-PAGE). Без снимка слот просто не будет
* «тихим», и следующий кадр начнётся с heal — старое сотрётся. */
if (w && h) cd_sig_make(who, &cd_sig[who][dp]);
pop_dbg_b5(); /* ЗАМЕР: pop_char_draw целиком */
}
void pop_char_fore(uint8_t who) __banked