guard_over_kid — только когда кого-то рисуем: минус 14 118
Разложил остаток цианной фазы (44 007 на трёх вызовах): pop_loose_mob_draw 978 гейт mobs_live работает guard_over_kid 14 424 трамплин в банк 8 + два objtile_at_char pop_char_skip_mask 28 605 трамплин в банк 4 + два cd_quiet guard_over_kid отвечает на вопрос «кто рисуется поверх кого», а он не имеет смысла, когда не рисуется никто. Перенёс вызов ПОСЛЕ pop_char_skip_mask и сделал условным: при skip == 3 оба слота тихие, и порядок не нужен. Перестановка безопасна: обе функции только читают, и читают разное — skip_mask снимок cd_sig, guard_over_kid габариты pop_cd прошлого кадра. Замер 11/15, лёгкая позиция: циан 55 257 -> 41 280, работа кадра 456 780 -> 442 662. Проверено в MAME: статика чистая, в бою (Кид сближается и бьёт стража) персонажи перекрываются правильно, порядок не сломался. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -641,18 +641,26 @@ int main(void)
|
||||
* так окно задней стены и передняя грань пола оказывались на плите. */
|
||||
pop_dbg_m10(); /* ЗАМЕР: check_mirror сделан */
|
||||
pop_loose_mob_draw();
|
||||
pop_dbg_m11(); /* ЗАМЕР: pop_loose_mob_draw сделан */
|
||||
{ /* Кто позже — тот поверх; порядок задаёт обход тайлов, а не роль
|
||||
* персонажа (см. guard_over_kid). Отрисовка одна на всех Char
|
||||
* (pop_cdraw.c), различает их только слот. */
|
||||
uint8_t g_after = guard_over_kid();
|
||||
/* Пересчёт после тика: слот, за который heal не платили, мог
|
||||
* всё-таки сдвинуться — тогда бит снимется, а прошлый кадр
|
||||
* сотрёт сам pop_char_draw (страховка cd_heal). */
|
||||
uint8_t g_after;
|
||||
skip = pop_char_skip_mask();
|
||||
pop_dbg_m12(); /* ЗАМЕР: skip_mask сделан */
|
||||
/* Порядок «кто поверх кого» нужен, только если кого-то РИСУЕМ.
|
||||
* При skip == 3 оба слота тихие, рисовать некого — а вызов стоит
|
||||
* трамплина в банк 8 и двух objtile_at_char, 14 424 такта
|
||||
* (замер 11/15, 2026-08-19). Перестановка безопасна: обе
|
||||
* функции только читают, и читают разное — skip_mask снимок
|
||||
* cd_sig, guard_over_kid габариты pop_cd прошлого кадра. */
|
||||
g_after = (skip == 3) ? 0 : guard_over_kid();
|
||||
if (!g_after && !(skip & 2)) { pop_char_draw(POP_CH_OPP); pop_char_fore(POP_CH_OPP); }
|
||||
PROF(6); /* кадр Кида (тот же циан) */
|
||||
if (!(skip & 1)) pop_char_draw(POP_CH_KID); /* спрайт + брызги + клинок */
|
||||
pop_dbg_m11(); /* ЗАМЕР: Кид нарисован */
|
||||
#if DBG_KIDOBJ
|
||||
/* ВРЕМЕННО: трасса для сверки с SDLPoP кадр в кадр. Место — то
|
||||
* же, что у оригинала (конец add_kid_to_objtable), и ВНЕ skip:
|
||||
@@ -673,7 +681,6 @@ int main(void)
|
||||
/* ПЕРЕДНИЙ СЛОЙ по пометкам — последним в кадре, как foretable у
|
||||
* оригинала (draw_tables, seg008:1373). Пометки ставят сами
|
||||
* объекты вокруг себя (pop_redraw.h). */
|
||||
pop_dbg_m12(); /* ЗАМЕР: соперник + mob поверх сделаны */
|
||||
pop_fore_needed();
|
||||
pop_hp_draw(); /* полоса HP — только при изменении */
|
||||
PROF(6); /* fore поверх Kid + борта */
|
||||
|
||||
Reference in New Issue
Block a user