From ac9871c58c77c32b92e4e47ac004edf84bded848 Mon Sep 17 00:00:00 2001 From: Alexander Petrov Date: Thu, 30 Jul 2026 09:57:26 +0300 Subject: [PATCH] =?UTF-8?q?PoP=20roomtest:=20=D1=84=D0=B0=D0=BA=D0=B5?= =?UTF-8?q?=D0=BB=20=D0=B0=D0=BD=D0=B8=D0=BC=D0=B8=D1=80=D1=83=D0=B5=D1=82?= =?UTF-8?q?=D1=81=D1=8F=20=D0=BA=D0=B0=D0=B6=D0=B4=D1=8B=D0=B9=20=D0=BB?= =?UTF-8?q?=D0=BE=D0=B3=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D0=B9=20=D0=BA?= =?UTF-8?q?=D0=B0=D0=B4=D1=80=20(TORCH=5FANIM=5FDIV)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Делитель (torch_tick & 1) занижал скорость пламени вдвое: один логический кадр = 3 vsync и соответствует игровому тику оригинала, а animate_torch (seg007:03C1) меняет кадр КАЖДЫЙ тик. Теперь темп задаётся явной константой TORCH_ANIM_DIV (1 = как в оригинале, 2 = прежнее поведение), счётчик компилируется только когда он реально нужен. Побочный эффект важнее визуального: раньше половина кадров делала работу факелов, половина нет, и бюджет кадра «прыгал». Замер по 100 кадрам до правки: 349 008..371 262, разброс 22 254 такта (6.2 %). После: по 225 кадрам 370 140..371 160, разброс 1020 тактов (0.27 %) — каждый кадр стал худшим случаем, и цифре можно верить. Бюджет сейчас (комната 3, Kid + страж, статика): 0.861..0.863 кадра, запас 58 840 тактов до 430 000. Кроссбанковых вызовов 19 за кадр (~654 такта каждый = 12 400, 3.3 % кадра) — столько максимум вернёт батчинг; профиль вызовов снят breakpoint'ом на ___sdcc_bcall_ehl с печатью HL/E и раскладкой адресов по .map. Замечание по методике: мерить надо ПО МНОЖЕСТВУ кадров. Единичные всплески до 1.5 кадра, которые я сперва принял за проблему движка, оказались наводкой от прерываний мыши на хосте — при неподвижной мыши 225 кадров подряд без единого превышения. Проверено, что --w3 (он остался в sprinter-cc) кладёт в W3 только код и rodata: --dataseg ему не передаётся, глобал --w3 модуля лёг в общий _DATA — сюрпризов при возврате к резиденту не будет. Co-Authored-By: Claude Opus 5 --- applications/PoP/roomtest/pop_trob.c | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/applications/PoP/roomtest/pop_trob.c b/applications/PoP/roomtest/pop_trob.c index 83298b7..b8f54a1 100644 --- a/applications/PoP/roomtest/pop_trob.c +++ b/applications/PoP/roomtest/pop_trob.c @@ -345,12 +345,29 @@ uint8_t pop_trob_room_active(uint8_t room) return 0; } -static uint8_t torch_tick; /* делитель скорости анимации пламени */ + +/* Темп анимации пламени в ЛОГИЧЕСКИХ кадрах (один логический кадр = 3 + * vsync и соответствует игровому тику оригинала): + * 1 — кадр пламени каждый тик, как в оригинале; кадры при этом ровные по + * тактам, что нужно для счёта бюджета; + * 2 — вдвое реже (так было до 2026-07-30; пламя шло на половинной + * скорости, а бюджет кадра «прыгал» на 6.2 % от того, попал кадр на + * анимацию или нет). */ +#define TORCH_ANIM_DIV 1 + +#if TORCH_ANIM_DIV > 1 +static uint8_t torch_tick; +#define TORCH_ANIM_NOW ((uint8_t)(torch_tick % TORCH_ANIM_DIV) == 0) +#else +#define TORCH_ANIM_NOW 1 +#endif void pop_process_trobs(uint8_t cur_room) { uint8_t i, w = 0; +#if TORCH_ANIM_DIV > 1 torch_tick++; +#endif /* Перерисовка «покоя» законченных пик/кнопок (обе страницы). * row/col ведём бегущими счётчиками, а НЕ через i/10, i%10: иначе SDCC @@ -394,11 +411,9 @@ void pop_process_trobs(uint8_t cur_room) break; case TILE_TORCH: case TILE_TORCH_DEBRIS: - /* animate_torch (seg007:03C1): кадр пламени; анимация вечная — - * type остаётся 1, пока комната отрисована. Смена кадра — через - * ЛОГИЧЕСКИЙ кадр (torch_tick): у нас кадр короче игрового тика - * оригинала, и пламя «кипело» вдвое быстрее нужного. */ - if (room == cur_room && (torch_tick & 1) == 0) + /* animate_torch (seg007:03C1): анимация вечная — type остаётся + * 1, пока комната отрисована. Темп — TORCH_ANIM_DIV. */ + if (room == cur_room && TORCH_ANIM_NOW) mod[tp] = get_torch_frame(mod[tp]); break; case TILE_POTION: