Замер цианной фазы: крупного лишнего в отрисовке персонажа нет
Циан 188 004 не двигался ни от P1, ни от P5, ни от P2b — разложил его зондами. Хорошая новость: Кид УЖЕ пропускается (204 такта на pop_char_draw), то есть надежда P3 сбылась после P1 — метка от чомпера до него больше не дотягивается. Страж же перерисовывается каждый кадр честно: пламя правого факела (0,7) рисуется в ячейке (0,8), где он стоит, и реально накрывает ему голову (пламя занимает y 5..22, страж 12..62). Отрисовка стража — 148 302: pop_char_fore (2 трамплина в банк 2 + обход тайлов) 62 778 42 % клинок (sword_draw + overlay_add + clip_add) 27 522 19 % блит спрайта + clip_char_right 20 982 14 % загрузка кадра и геометрия 12 696 9 % pop_clip_char_top (трамплин банк 4 -> банк 3) 8 658 6 % снимок прямоугольника + cd_clip_add 7 890 5 % gfx_w0_unmap + cd_sig_make 4 968 3 % вход + cd_heal 2 946 2 % Единственная явно лишняя статья — трамплин clip_char_top, и снять его непросто: функции нужны get_tile и таблицы деления из банка 3, перенос в резидент вернёт тот же трамплин внутрь. Остальное — работа, которую персонаж действительно делает. Зонды переставлены с уже закрытых замеров (loose_tick, физика) внутрь pop_cdraw; оснастка снимается позицией P12, когда оптимизация закончится. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -23,6 +23,7 @@
|
||||
#include "_pop_kdraw.h"
|
||||
#include "pop_vflip.h" /* зеркальные страницы атласов (зелье инверсии) */ /* меч + блит по id — сосед по банку 4 */ /* атласы/кадр Кида, pop_sword_draw, окна Char */
|
||||
#include "pop_cdraw.h"
|
||||
#include "pop_state.h" /* ВРЕМЕННО: зонды pop_dbg_b* */
|
||||
#include "pop_bg.h" /* POP_YOFF, pop_fore_over_char, pop_fore_set_clip */
|
||||
#include "_pop_draw.h" /* pop_onscreen_cols / pop_heal_fast */
|
||||
#include "pop_map.h" /* hitp_curr/hitp_max — HP Кида; clip_char */
|
||||
@@ -503,6 +504,7 @@ 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; /* габарит кадра: нечего перекрывать */
|
||||
@@ -633,7 +635,9 @@ 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;
|
||||
@@ -691,6 +695,7 @@ 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;
|
||||
@@ -700,6 +705,7 @@ void pop_char_draw(uint8_t who) __banked
|
||||
s->fpw = w; s->fph = h; /* габарит КАДРА (не обрезанный): */
|
||||
/* по нему считается футпринт */
|
||||
}
|
||||
pop_dbg_m15(); /* ЗАМЕР: снимок прямоугольника сделан */
|
||||
if (hurt) cd_splash(s, who, pages, fp_x, obj_y);
|
||||
/* add_sword_to_objtable (seg006:1798): клинок отдельным спрайтом поверх
|
||||
* персонажа — со своим прямоугольником heal. */
|
||||
@@ -710,6 +716,7 @@ void pop_char_draw(uint8_t who) __banked
|
||||
cd_clip_add(s, sx, sy, sw, sh);
|
||||
}
|
||||
}
|
||||
pop_dbg_m16(); /* ЗАМЕР: splash + клинок сделаны */
|
||||
gfx_w0_unmap();
|
||||
/* Что именно нарисовано на ЭТОЙ странице — снимок для пропуска
|
||||
* следующих кадров (DRAW-COST). Только если кадр РЕАЛЬНО рисовали:
|
||||
@@ -722,6 +729,7 @@ 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
|
||||
@@ -738,6 +746,7 @@ void pop_char_fore(uint8_t who) __banked
|
||||
if (s->fpw)
|
||||
pop_fore_over_char(who == POP_CH_KID ? &Kid : &Guard,
|
||||
s->fpx, s->fpy, s->fpw, s->fph);
|
||||
pop_dbg_b6(); /* ЗАМЕР: pop_char_fore целиком */
|
||||
}
|
||||
|
||||
/* ---- ОТРАЖЕНИЕ В ЗЕРКАЛЕ (check_mirror, seg003:0798) ---------------- *
|
||||
|
||||
Reference in New Issue
Block a user