PoP roomtest: факел анимируется каждый логический кадр (TORCH_ANIM_DIV)
Делитель (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 <noreply@anthropic.com>
This commit is contained in:
@@ -345,12 +345,29 @@ uint8_t pop_trob_room_active(uint8_t room)
|
|||||||
return 0;
|
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)
|
void pop_process_trobs(uint8_t cur_room)
|
||||||
{
|
{
|
||||||
uint8_t i, w = 0;
|
uint8_t i, w = 0;
|
||||||
|
#if TORCH_ANIM_DIV > 1
|
||||||
torch_tick++;
|
torch_tick++;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Перерисовка «покоя» законченных пик/кнопок (обе страницы).
|
/* Перерисовка «покоя» законченных пик/кнопок (обе страницы).
|
||||||
* row/col ведём бегущими счётчиками, а НЕ через i/10, i%10: иначе SDCC
|
* row/col ведём бегущими счётчиками, а НЕ через i/10, i%10: иначе SDCC
|
||||||
@@ -394,11 +411,9 @@ void pop_process_trobs(uint8_t cur_room)
|
|||||||
break;
|
break;
|
||||||
case TILE_TORCH:
|
case TILE_TORCH:
|
||||||
case TILE_TORCH_DEBRIS:
|
case TILE_TORCH_DEBRIS:
|
||||||
/* animate_torch (seg007:03C1): кадр пламени; анимация вечная —
|
/* animate_torch (seg007:03C1): анимация вечная — type остаётся
|
||||||
* type остаётся 1, пока комната отрисована. Смена кадра — через
|
* 1, пока комната отрисована. Темп — TORCH_ANIM_DIV. */
|
||||||
* ЛОГИЧЕСКИЙ кадр (torch_tick): у нас кадр короче игрового тика
|
if (room == cur_room && TORCH_ANIM_NOW)
|
||||||
* оригинала, и пламя «кипело» вдвое быстрее нужного. */
|
|
||||||
if (room == cur_room && (torch_tick & 1) == 0)
|
|
||||||
mod[tp] = get_torch_frame(mod[tp]);
|
mod[tp] = get_torch_frame(mod[tp]);
|
||||||
break;
|
break;
|
||||||
case TILE_POTION:
|
case TILE_POTION:
|
||||||
|
|||||||
Reference in New Issue
Block a user