P15 переписан: перекрытия нет, виновата грубость метки
Пользователь поймал ошибку в моём расчёте, глядя на экран: страж целиком правее пламени, пересекаться может только меч. Проверка по памяти машины подтвердила и уточнила: страж, спрайт x 257..284 y 18..56 страж, клинок x 241..261 y 31..37 пламя факела x 232..247 y 5..22 Ошибок было две. Первая: координаты пламени я взял по предположению «факел в колонке 7», а он в колонке 6 (пламя рисуется в ячейке правого соседа). Вторая, содержательная: ФИЗИЧЕСКОГО ПЕРЕКРЫТИЯ НЕТ ВООБЩЕ — по x клинок и пламя пересекаются, но по y между ними девять пикселей зазора. Настоящая причина: pop_cd_touch хранит метку как маску КОЛОНОК по 32 px на ТРИ ряда по 63 px (cd_row_of). Пламя (y 5..22) и клинок (y 31..37) попадают в один ряд 0 и одну колонку 7 — cd_quiet считает слот задетым. 148 302 такта, 23 % кадра, за ложную тревогу. Решение стало проще и точнее: хранить на колонку диапазон y вместо номера ряда (10 x 2 байта x 2 страницы = 40 байт). Расчётом проверено, что это спасает стража и НЕ спасает Кида в тяжёлой позиции — там перекрытие настоящее, и он честно перерисовывается. Вариант с 8-пиксельными полосами тоже работает, 16-пиксельные уже нет. Прежние предложения (частичная перерисовка по пересечению, обрезка фона под персонажем) записаны как НЕ НУЖНЫЕ: они решали задачу, которой нет. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -150,26 +150,34 @@
|
||||
|
||||
Новое, найдено 2026-08-19.
|
||||
|
||||
### P15. Неподвижный персонаж перерисовывается целиком — ОБЯЗАТЕЛЬНО [замер 2026-08-19]
|
||||
### P15. Метка «фон трогали» слишком груба — ОБЯЗАТЕЛЬНО [замер 2026-08-19]
|
||||
|
||||
**Постановка пользователя:** проверять, нужна ли отрисовка стража, когда он
|
||||
не двигается. Если движется — лишние ~150 000 приемлемы: в оригинале во
|
||||
время боя число физических кадров на логический тоже растёт на единицу.
|
||||
не двигается. Если движется — лишние ~150 000 приемлемы (в оригинале при
|
||||
бое число физических кадров на логический тоже растёт на единицу).
|
||||
|
||||
Измерено чтением `pop_cd` из памяти машины:
|
||||
|
||||
| | прямоугольник | размер |
|
||||
| объект | x | y |
|
||||
|---|---|---|
|
||||
| страж | x 257..284, y 18..56 | 28 × 39 |
|
||||
| пламя факела (0,7) | x 264..279, y 5..22 | 16 × 18 |
|
||||
| **пересечение** | **x 264..279, y 18..22** | **16 × 5** |
|
||||
| страж, спрайт | 257..284 | 18..56 |
|
||||
| страж, клинок | 241..261 | 31..37 |
|
||||
| пламя факела (колонка 6 → ячейка 7) | 232..247 | 5..22 |
|
||||
|
||||
**148 302 такта (23 % кадра) тратятся из-за 80 задетых пикселей на макушке.**
|
||||
Пересечение при этом НАСТОЯЩЕЕ — дело не в грубости маски меток.
|
||||
**Физического перекрытия нет:** по x клинок и пламя пересекаются, по y между
|
||||
ними девять пикселей зазора. Стража будит гранулярность метки —
|
||||
`pop_cd_touch` хранит маску колонок по 32 px на ТРИ ряда по 63 px, и пламя с
|
||||
клинком слипаются в одном ряду. Цена ложной тревоги — **148 302 такта,
|
||||
23 % кадра**.
|
||||
|
||||
Полная постановка с двумя вариантами решения (частичная перерисовка против
|
||||
обрезки фона под персонажем) — `TASKS_OPEN.md`, якорь `char-partial-redraw`.
|
||||
Смежное: **P14** — вторая половина той же цены.
|
||||
Решение: хранить на колонку диапазон y вместо номера ряда (10 × 2 байта × 2
|
||||
страницы = 40 байт). Проверено расчётом, что это спасает стража и НЕ
|
||||
спасает Кида в тяжёлой позиции — там перекрытие настоящее.
|
||||
|
||||
**Осторожно с историей вопроса:** первая редакция этой позиции утверждала,
|
||||
что перекрытие реальное (16 × 5 пикселей на макушке) и предлагала частичную
|
||||
перерисовку. Это была ошибка — координаты пламени взяты по предположению
|
||||
«факел в колонке 7» без проверки, а пользователь увидел на экране, что
|
||||
страж целиком правее пламени. Полная постановка — `TASKS_OPEN.md`, якорь
|
||||
`char-partial-redraw`.
|
||||
|
||||
### P14. Fore-проход персонажа — 62 778…89 000 НА ПЕРСОНАЖА [замер 2026-08-19]
|
||||
|
||||
@@ -381,7 +389,7 @@ BUG-LATTICE-DOORTOP, BUG-SEAM-WEDGE-1) — только отдельным за
|
||||
|
||||
| # | что | ожидание | риск | комментарий |
|
||||
|---|---|---:|---|---|
|
||||
| **P15** | **неподвижный персонаж: не перерисовывать целиком** | **до −130 000** | средний | **ОБЯЗАТЕЛЬНАЯ** (пользователь, 2026-08-19). 148 302 из-за пересечения 16×5 |
|
||||
| **P15** | **точность метки «фон трогали»: диапазон y на колонку** | **−148 302** | низкий | **ОБЯЗАТЕЛЬНАЯ** (пользователь, 2026-08-19). Перекрытия НЕТ, ложная тревога из-за рядов по 63 px |
|
||||
| **P14** | **fore-проход персонажа** — 62 778 у стража, ~89 000 у Кида | **до −80 000** | высокий | самая дорогая статья кадра (20 %). Включает P10 как первый шаг |
|
||||
| P4 | накладные блита (4 правки) | −28 000 | низкий | 6 126 фиксированных на любой блит |
|
||||
| P11 | мелочи с известной ценой | −26 000 | низкий | `clip_char_top` 8 658 подтверждён замером |
|
||||
|
||||
Reference in New Issue
Block a user