Вариант B: кусок с завёрнутым рядом рисуется под всем (корзина 30)
Порт правила оригинала, разобранного в 272cf8f. y_to_row_mod4 даёт −1 и
для куска выше потолка, и для ушедшего ниже комнаты; get_tilepos_nominus
сводит оба в тайл 30, а объекты тайла 30 рисуются в redraw_needed_tiles
ПЕРВЫМИ, до всего обхода тайлов.
Что сделано:
- defer = 0 для таких кусков: они под всем, включая Кида. Раньше
сравнение рядов читало −1 как «обходится последним» = «поверх всего»;
- оверлею отдаётся ориентир 3 («раньше любого ряда 2,1,0») вместо сырого
−1 — гейт other_overlay_tile перестал отбрасывать возврат соседа, из-за
чего тело плиты не возвращалось и оставался только её торец из
переднего слоя;
- в набор перекрываемых тайлов добавлена СВОЯ клетка (только для этого
случая: у куска в обычном ряду объект вливается в midtable после частей
своего тайла, и перерисовывать её нельзя).
Отладочная обвязка разбора (журнал решений оверлея, маска перекрывающих
тайлов) снята; счётчик перерисовок за кадр в pop_redraw_needed оставлен —
он дешёвый и пригодится для HEAL-WIDTH.
ЗАМЕР 13/23, 3032 кадра, против тега mob-order-B-start:
работа 888 984 -> 913 848 (+24 864)
синяя 159 804 -> 159 810
зелёная 427 242 -> 440 418 (+13 176)
циан 378 864 -> 393 000 (+14 136)
Период кадра не изменился: 4 растра в 23 кадрах, 5 в двух.
Зелёная вышла за растровый кадр (440 418 против 430 000). Детализация:
pop_loose_tick 185 826, из них pop_loose_mob_tick 168 180; тробы +
redraw_needed 337 800. Разбор и план возврата тактов — HEAL-WIDTH.
Визуальная проверка комнаты 14 за пользователем: поймать кадр с куском
снимками мне не удалось.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -3337,3 +3337,46 @@ draw_tile_anim(); draw_tile_bottom(0); draw_loose(0);
|
||||
`draw_tile_anim_right` — то есть анимированной правой грани СОСЕДА (пики,
|
||||
ворота, loose). Симптома на это пока не видели; если всплывёт «правая грань
|
||||
соседа под персонажем/куском» — смотреть сюда.
|
||||
|
||||
### Вариант B: порт корзины 30 (2026-08-18)
|
||||
|
||||
Реализовано то, что разобрано в коммите `272cf8f`. Кусок, у которого ряд
|
||||
объекта вне 0..2 (`y_to_row_mod4` даёт −1 и «выше потолка», и «ниже пола»),
|
||||
считается объектом ТАЙЛА 30 — а такие оригинал рисует ПЕРВЫМИ, до всего
|
||||
обхода тайлов. Два следствия:
|
||||
|
||||
- `defer = 0` — кусок идёт под всем, включая Кида (раньше сравнение рядов
|
||||
давало обратное: «−1 обходится последним» читалось как «поверх»);
|
||||
- оверлею отдаётся ориентир **3** («раньше любого ряда обхода 2,1,0»)
|
||||
вместо сырого −1, и в набор перекрываемых тайлов добавляется **своя
|
||||
клетка** — у куска в обычном ряду её перерисовывать нельзя, там объект
|
||||
вливается в midtable уже после частей своего тайла.
|
||||
|
||||
**Замер 13/23 (3032 кадра, зонды фаз + детализация зелёной):**
|
||||
|
||||
| секция | тег `mob-order-B-start` | после B | дельта |
|
||||
|---|---:|---:|---:|
|
||||
| работа | 888 984 | **913 848** | +24 864 |
|
||||
| синяя | 159 804 | 159 810 | +6 |
|
||||
| зелёная | 427 242 | **440 418** | +13 176 |
|
||||
| циан | 378 864 | 393 000 | +14 136 |
|
||||
|
||||
Период кадра не изменился: 4 растра в 23 кадрах, 5 в двух — как и до правки.
|
||||
|
||||
**Зелёная вышла за растровый кадр** (440 418 против 430 000) при цели
|
||||
400 000. Детализация показывает, где именно:
|
||||
|
||||
| участок зелёной | максимум |
|
||||
|---|---:|
|
||||
| `pop_loose_tick` целиком | 185 826 |
|
||||
| — из них `pop_loose_mob_tick` | **168 180** |
|
||||
| — циклы по тайлам | 23 736 |
|
||||
| — `check_loose_fall_on_kid` | 5 868 |
|
||||
| тробы + `pop_redraw_needed` | 337 800 |
|
||||
| шов и прочее | 11 964 |
|
||||
|
||||
(максимумы взяты по разным кадрам, поэтому не складываются в общий).
|
||||
|
||||
Основной кандидат на возврат этих тактов — задача
|
||||
[HEAL-WIDTH](TASKS_OPEN.md#heal-width): heal'ы кусков и плит берут ширину по
|
||||
клеткам, а фактический след — 58/57.
|
||||
|
||||
Reference in New Issue
Block a user