ADR-013: разбор редакторной сборки фронта vs Docker/CI — разница в отключённом сжатии; поправка к ADR-012 (оба дефекта есть и в 29)
This commit is contained in:
@@ -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 (сейчас жмёт уже сжатое)
|
||||||
|
|||||||
@@ -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`) → поведение в браузере.
|
||||||
|
|||||||
Reference in New Issue
Block a user