diff --git a/applications/PoP/roomtest/pop_trob.c b/applications/PoP/roomtest/pop_trob.c index 6f9e9a0..53627c1 100644 --- a/applications/PoP/roomtest/pop_trob.c +++ b/applications/PoP/roomtest/pop_trob.c @@ -635,13 +635,31 @@ void pop_process_trobs(uint8_t cur_room) __banked pop_dbg_m8(); /* ЗАМЕР: префетч кодов тайлов сделан */ + /* Указатель на модификаторы КОМНАТЫ кэшируется между итерациями. + * + * pop_trob_modif объявлен __banked, и вызов его на КАЖДЫЙ trob — это + * трамплин из банка 6 в банк 6 же... нет: из горячего цикла в банковую + * функцию, то есть полный переход через резидент. А комната у trob'ов + * в подавляющем большинстве кадров ОДНА (все они из cur_room, чужие + * появляются лишь у брошенных плит соседней комнаты). Тот же паттерн + * «трамплин в цикле», что дал −23 784 на луче видимости стража + * (P2b) и −14 118 на guard_over_kid (P16). + * + * Сбрасывается на каждом кадре: room_seen внутри pop_trob_modif живёт + * дольше, но указатель на строку room_modif может смениться при + * перезагрузке комнаты, поэтому кэш локальный для одного прохода. */ + { + uint8_t mod_room = 0; /* 0 = «ещё не брали» (комнаты 1..24) */ + uint8_t *mod = 0; + for (i = 0; i < trobs_count; i++) { uint8_t room = trobs[i].room; uint8_t tp = trobs[i].tilepos; uint8_t code = trob_code[i]; - uint8_t *mod = pop_trob_modif(room); int8_t type = trobs[i].type; + if (room != mod_room) { mod = pop_trob_modif(room); mod_room = room; } + switch (code) { case TILE_SPIKE: animate_spike(&mod[tp], &type); @@ -819,6 +837,7 @@ void pop_process_trobs(uint8_t cur_room) __banked } } } + } /* конец блока с кэшем mod/mod_room */ /* compact: удалить завершённые (type < 0). */ for (i = 0; i < trobs_count; i++)