修:draw-ui / oil-motion 原被当子模块指针收录 ⇒ 改为正常文件入库(两份内容原先对别人是空的)

一、问题(本轮实测)
`draw-ui` 与 `oil-motion` 目录里**各自带一个内嵌 `.git`** ⇒ 上一次提交把它们记成了 **gitlink(子模块指针)**
⇒ 仓库里只存了一个不属于任何远端的 commit id,**别人克隆下来这两份是空的** ✗(`git status` 显示 ` m draw-ui` / ` m oil-motion` = 子模块内容有改动)。

二、处置(可回退)
· 把两处的 `.git` **挪走**(⛔ 不是删除)⇒ `归档/内嵌git-20261008/{draw-ui,oil-motion}.git`;
· `git rm --cached` 掉那两个 gitlink,再 `git add` 两个目录 ⇒ **按正常文件入库**(内容才真的进仓库)。

三、副作用(如实记)
挪走 `.git` 后,这两个技能**不能再原地 `git pull` 取上游更新**(要更新得重新拉一份覆盖);
如需恢复其本地仓库,把 `归档/内嵌git-20261008/` 里的 `.git` 挪回原处即可。
This commit is contained in:
admin committed 2026-10-08 22:29:52 +08:00
1 parent e03465c398
commit 237a09a5b0
161 files changed
+19429 -2

No files matched your search

+122
View File
@@ -0,0 +1,122 @@
# 自动选择交付与运行时
本文件是媒体格式选择的唯一事实源。选择分为三个正交问题,必须依次处理:
1. `background_owner` 决定背景是否烧入媒体。
2. 参数空间、访问方式和资源预算决定媒体格式。
3. `time_control` 决定运行时控制器。
不要用媒体格式推断播放方式,也不要用滚动或分页布局推断 scrub。
## 1. 背景归属
- `video`:背景与主体在同一视频中生成,选择 `baked-video`,不抠色。
- `page`:主体必须透明复用。关键帧直接生成真实 Alpha;需要视频模型时才从透明源合成色键输入,再在 `alpha-atlas` 与 `chroma-video` 中预算。
`--background-owner` 没有默认值。合同未锁定时停止,不得因为参数缺失静默选择透明或色键路线。
## 2. 执行预算
生成素材前用 Brief 的计划帧数(目标帧率 × 时长)运行一次,帧准备完成后再用实际帧数复核:
```bash
python3 "$OIL_MOTION/scripts/motion_budget.py" \
--frames "$FRAME_COUNT" \
--display "$DISPLAY_SIZE" \
--dpr "$TARGET_DPR" \
--driver "$DRIVER" \
--time-control "$TIME_CONTROL" \
--parameter-space "$PARAMETER_SPACE" \
--background-owner "$BACKGROUND_OWNER" \
--report build/motion-budget.json \
--strict \
--json
```
只有 `driver=scroll` 且 `time_control=scrub` 时才额外传 `--scroll-pages`,用于检查滚动采样密度。分段播放按成片帧率验收,不把页面数量换算成 scrub 帧数。
读取以下结果:
- `delivery.selected`:唯一主媒体格式。
- `delivery.reasonCodes`:选择依据。
- `runtime.renderer`:对应渲染器。
- `runtime.controller`:对应时间控制器。
- `failures` 与 `passes`:阻断项。
## 3. 固定决策顺序:媒体格式
1. `background_owner=video`:选择 `baked-video`。
2. `parameter_space=2d`:选择 `alpha-atlas`;超预算时降低采样或拆分轴后重新预算。
3. `parameter_space=discrete`:每个独立状态或转场分别预算,不把无序状态拼成线性视频。
4. 随机访问且单图集与解码内存均在预算内:选择 `alpha-atlas`。
5. 一维顺序访问且达到视频帧数门槛:选择 `chroma-video`。
6. 一维图集超过纹理或解码内存预算:选择 `chroma-video`。
7. 其余小型透明资源:选择 `alpha-atlas`。
`background_owner=video` 遇到二维或无序离散参数时,拆成多条独立烘焙片段分别预算;不能压成一条时间轴。
## 纹理上限怎么计算
`--max-texture=4096` 限制的是单张纹理的宽和高,不直接限制帧数。预算必须使用
“最大 CSS 显示尺寸 × 目标 DPR”得到最低单格尺寸,再计算单张图集容量:
```text
columns = floor(max_texture / cell_width)
rows = floor(max_texture / cell_height)
capacity = columns * rows
```
例如 48 帧、最低单格 640×640 px 时,4096 纹理只能容纳 6×6=36 帧,不能做成
一张图集。改成 7×7 时单格最多约 585×585 px;使用 576 px 只有在实际显示尺寸
乘 DPR 不超过 576 时才成立,不能为了塞进一张图而牺牲已确认的清晰度。
同理,16×14 排列能否放进一张图只取决于单格尺寸:宽最多 256 px,高最多约
292 px。帧数很多的图集能放进一张图,靠的是更小的单格,不是绕过了浏览器纹理上限。
当前运行时只接受一张主图集。圆环或一维时间轴超出单图集预算时自动选择
`chroma-video`;真正的二维参数仍需要 `alpha-atlas`,超预算时降低参数采样密度、
拆分独立状态或拆分参数轴后重新预算。不要自行实现未经过预算和预加载验收的多图集切换。
## 4. 控制器选择
控制器只由合同中的 `time_control` 决定:
| `time_control` | `runtime.controller` |
|---|---|
| `scrub` | `frame-scrub` |
| `segment-play` | `segment-playback` |
| `autonomous` | `autonomous-playback` |
`delivery.selected` 可以与任一合理控制器组合。例如视频既可以逐帧 scrub,也可以按片段正常播放;图集也可以按时间自动播放。
## 超预算处理
- `alpha-atlas` 超预算:降低采样密度、拆分独立状态,或在用户已确认的显示范围内重新预算;不得偷降清晰度。
- `chroma-video` 被选中:只保留 QA 帧和静态 Alpha 降级,不再生成大型 Alpha 图集。
- `baked-video` 被选中:不得加入抠色、色键 Shader 或页面背景合成。
- 源素材低于最大 CSS 尺寸乘 DPR:重新生成或调整已确认的显示目标,不从低清网页资产反向放大。
任何调整后都重新运行预算,旧报告失效。
### 母版像素不足时的显示预算
视频的可用分辨率见 [prompting.md](prompting.md#分辨率和时长)。预算使用探测到的实际
像素尺寸,通过 `--source WIDTHxHEIGHT` 传入;不能把分辨率标签或放大后的尺寸当作源尺寸。
同时核对宽高与最终裁切,目标 DPR 不得超过
`min(源宽 / CSS 宽, 源高 / CSS 高)`。
例如只有 `1344×768` 母版、最大显示为 `1280×720` CSS px 时,把原先的高 DPR 目标下调为
`--display 1280x720 --dpr 1.05 --source 1344x768`,所需像素为 `1344×756`,
再按上面的预算命令运行 `--strict` 并重写 `build/motion-budget.json`。若保留 DPR `2`,
则把 16:9 显示目标缩小到最多 `672×378` CSS px。编译资源宽度不得超过母版可用宽度。
降低目标 DPR 是素材清晰度取舍,不改变设备的真实 DPR,也不代表在高 DPR 屏幕上达到
原来的清晰度。将调整同步到合同的 `destination` 与 Brief 的 `quality_target`、
`pixel_dimensions`,按新目标重新验收;不得只改预算数值而仍在更大的容器中显示。
## 后续路由
- `alpha-atlas`:读 [alpha-atlas.md](alpha-atlas.md)。
- `chroma-video`:读 [chroma-video.md](chroma-video.md)。
- `baked-video`:读 [baked-video.md](baked-video.md)。
- 控制器实现:读 [runtime.md](runtime.md)。