ADR-013: разбор редакторной сборки фронта vs Docker/CI — разница в отключённом сжатии; поправка к ADR-012 (оба дефекта есть и в 29)

This commit is contained in:
Porfiry
2026-09-15 19:56:29 +03:00
parent b9799bf091
commit af5dc5db4c
2 changed files with 76 additions and 0 deletions
+16
View File
@@ -250,3 +250,19 @@ curl -s -o /dev/null -w '%{http_code} -> %{redirect_url}\n' https://smart-updown
**Важное подтверждение:** билд `sol` в браузере **дошёл до игрового цикла** (`Phase -> Idle` → **Важное подтверждение:** билд `sol` в браузере **дошёл до игрового цикла** (`Phase -> Idle` →
`Phase -> Approach`) — раньше в headless ни одна сборка так далеко не шла. Статика с nginx отдаётся корректно. `Phase -> Approach`) — раньше в headless ни одна сборка так далеко не шла. Статика с nginx отдаётся корректно.
## 2026-09-15 (5) — исследование: редакторная сборка vs наша Docker/CI (ничего не меняли)
**Вердикт: Docker не виноват.** Разница — наш `BuildScript.cs` насильно ставит
`WebGLCompressionFormat.Disabled`; фронт собирает с **Brotli + Decompression Fallback** (отсюда
`.unityweb`). Было в браузер 26 МБ (52 МБ wasm + gzip на лету), стало бы 16.4 МБ. Код в обеих сборках
эквивалентен (маркеры в wasm совпадают), версия Unity одинаковая (6000.3.16f1). Наш конвейер
(GameCI-образ + `-batchmode -executeMethod`) — стандартная практика, не костыль. См. ADR-013.
**⚠️ Важная поправка:** оба дефекта (`/api/api/state` → 404 и `getProvider is not defined`) есть и в
НАШЕЙ сборке 29 — это исходники, а не «его сборка». Задача переехала в кодовую правку.
- [ ] решить: переводить ли сборку на Brotli + Decompression Fallback (или gzip_static) — **ждём владельца**
- [ ] `[pump.front]` убрать двойной `/api` в `BackendClient`/`SmartUpdownConfig`
- [ ] `[pump.front]` `getProvider`: экспортировать хелперы jslib наружу (или инлайнить)
- [ ] `[pump.ops]` `gzip off` для `.unityweb` в nginx LXC 152 (сейчас жмёт уже сжатое)
+60
View File
@@ -339,3 +339,63 @@ no-store`; `/api/state`,`/api/price`,`/solana-rpc/` → 200; сквозная с
⚠️ Что **подтверждено** этим билдом: игра в браузере **стартует и доходит до игрового цикла** ⚠️ Что **подтверждено** этим билдом: игра в браузере **стартует и доходит до игрового цикла**
(`[BinaryRocket] Phase -> Idle` → `Phase -> Approach`), чего в headless-окружении не делала ни одна (`[BinaryRocket] Phase -> Idle` → `Phase -> Approach`), чего в headless-окружении не делала ни одна
предыдущая сборка. То есть статика с nginx отдаётся корректно. предыдущая сборка. То есть статика с nginx отдаётся корректно.
## ADR-013 — Разбор: редакторная сборка фронта vs наша Docker/CI (только исследование, 2026-09-15)
**Вопрос владельца:** почему сборка фронтендера (редактор Unity на Mac через TeamCity) «нормальная»,
а наша (Docker/CI) «кривая косое». Задача была — исследовать, ничего не переделывать.
**Вердикт: Docker ни при чём.** Расхождение объясняется одной строкой в НАШЕМ скрипте сборки,
которая насильно выключает сжатие.
| | наша CI (сборка 29) | эталон фронта (`/sol/`) |
|---|---|---|
| файлы | `Build/WebGL.{loader.js,wasm,data,framework.js}` | `Build/Build.*.unityweb` |
| сжатие | **Disabled** (переопределено в `BuildScript.cs`) | **Brotli + Decompression Fallback** |
| wasm | 52.2 МБ raw | 8.59 МБ raw (≈49.1 МБ распакованных) |
| data | 18.3 МБ raw | 8.12 МБ raw (≈17.7 МБ распакованных) |
| едет в браузер | **26 МБ** (nginx жмёт gzip на лету) | **16.4 МБ** |
| версия Unity | 6000.3.16f1 | 6000.3.16f1 (та же!) |
**Причина.** `Assets/Editor/BuildScript.cs` (коммит `4468014`):
`PlayerSettings.WebGL.compressionFormat = WebGLCompressionFormat.Disabled;` — комментарий «Без предсжатия:
nginx отдаёт gzip по Accept-Encoding, мобильные прокси не ломают». Скрипт **затирает**
`ProjectSettings.asset` (`webGLCompressionFormat: 0`). gzip жмёт 52-МБ wasm всего в ~3.3×; brotli тот же
wasm жмёт в ~6×. Отсюда «у него нормально, у нас криво» — это транспорт, не сборка.
**Доки Unity:** *«If you enable Decompression Fallback, Unity appends the extension `.unityweb` to the
build file names. Otherwise, Unity appends `.gz` / `.br`.»* То есть `.unityweb` — следствие
Brotli+fallback, а не другой сборочный конвейер.
**Код в обеих сборках эквивалентен.** В распакованных `wasm` маркеры совпадают 1:1
(`SolanaBridge`=5, `PriceFeed`=2, `UnityWebRequest`=44, `Tonemapping`=4, `PostProcess`=1). Разница
размеров — сжатие/отладочные символы, не исходники.
**Наш конвейер — стандартная практика.** Образ `unityci/editor:ubuntu-6000.3.16f1-webgl-3.2.2` (GameCI),
запуск `unity-editor -batchmode -nographics -quit -executeMethod BuildScript.BuildWebGL` + лицензия `.ulf`
из env — ровно то, что описано в доках game.ci. «Своих кривых практик» здесь нет.
**⚠️ Поправка к прошлому отчёту (ADR-012):** оба дефекта, которые я назвал «дефектами сборки
фронтендера», присутствуют и в НАШЕЙ сборке 29 — проверено побайтово:
1. двойной префикс `/api/api/state` → 404: `ApiBase()` = `Origin()+"/api"`, а `BackendClient` зовёт
`HttpGetAsync("/api/state")`. Общий дефект исходников.
2. `ReferenceError: getProvider is not defined`: в `framework.js` есть вызовы `getProvider()`/`errMsg()`/
`loadWeb3()`, но нет определений — одинаковая картина в обеих сборках.
Это делает п.1–2 задачей для кодовой правки, а не «пересборки».
**Гипотеза (НЕ факт, требует проверки на железе):** в headless наша 29-я падала на шейдерах, а его
сборка доходила до игрового цикла (`Phase → Idle → Approach`). Возможная причина — `-nographics`
влияет на shader stripping / URP-варианты. Проверка: собрать без `-nographics`, сравнить поведение и
размеры. На живом железе разница может не проявиться вовсе.
**Наши побочные находки:** nginx сейчас жмёт `.unityweb` gzip'ом на лету — 0 выгоды (файл уже сжат
brotli), только CPU. Для `.unityweb` gzip надо выключать.
**Возможные шаги (НЕ выполнены — ждём решения):** (1) убрать переопределение `compressionFormat` /
поставить `Brotli` + fallback → `.unityweb` как у фронта, −40% трафика; (2) либо `gzip_static`,
а не сжатие на лету; (3) `gzip off` для `.unityweb`.
**Методика сравнения сборок** (переиспользовать при следующем разборе): распаковать brotli
(заголовок `UnityWeb Compressed Content`, смещение 0) → размеры raw/распакованных → `index.html`
(`buildUrl`, `dataUrl`,`codeUrl`,`frameworkUrl`) → число `function`-объявлений и наличие тел хелперов →
версия Unity в `wasm` → заголовки (`Content-Encoding`,`cache-control`) → поведение в браузере.