slime/show/video/README.md

85 lines
5.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 史莱姆搜索科普视频 · Manim / uv
以 `show/` 的教学实现与实测为基础。中文字幕、深色背景、16:9;绘图使用 Manim Community 的 Cairo 渲染器。
2026-10-16 版依据统一正文 DOCUMENT.md:先讲单区块的 Random 代码与完整坐标公式,
再讲 CPU → CUDA 按 seed 分工 → 按坐标分工 → outer sum。
后半段先建立有效种子的反推关系,再引入唯一的 5×5 窗口,
沿 p = 218767、m = 40302 的路径求出并验证世界种子 15959335054446。
章节顺序见 [STORYBOARD.md](STORYBOARD.md)。
当前输出是带字幕的动画,没有配音或背景音乐;同步生成完整口播稿和 SRT 字幕。
## 环境与运行
需要 Python 3.12、uv,以及 Cairo/Pango 开发库。Ubuntu 常规安装:
```bash
sudo apt install build-essential python3-dev pkg-config libcairo2-dev libpango1.0-dev fonts-noto-cjk texlive-latex-extra dvisvgm
cd show/video
uv sync --locked
uv run python render.py --quality preview
uv run python render.py --quality final
uv run python verify.py --quality final
```
FFmpeg 由 `imageio-ffmpeg` 提供,渲染脚本会自动配置。数学公式使用 `MathTex` / LaTeX,中文说明使用 `Text` / Pango。
公式采用 Computer Modern 数学字体,指数、下标、取整分式与集合符号均由 LaTeX 排版。
渲染优先使用系统的 `latex`、`dvisvgm`;本环境的本地 TeX Live 已解包到 `.native/texlive`,随项目目录保留。
也可通过 `SLIME_TEX_ROOT` 指向相同目录结构的本地 TeX Live,`tex_environment.py` 会配置路径并构建 `latex.fmt`。
本地解包版使用 `ls-R` 数据库查找,避免 WSL 下重复遍历目录;需要保留解包环境中的数据库。
本地转换器跳过 PostScript specials,保留 TeX 字形轮廓和 Manim 的原始 SVG 分组;
本工程公式没有 PostScript 插图,紧边界由字形计算,避免依赖本地 Ghostscript 设备初始化。
系统安装的 TeX / dvisvgm 使用正常转换路径。
换一台机器时,请按上面的系统安装命令补齐工具链。
中文字体优先使用 Microsoft YaHei / Noto Sans CJK SC / WenQuanYi Zen Hei。
WSL 会尝试使用 `/mnt/c/Windows/Fonts/msyh.ttc`,也可设置 `SLIME_FONT_PATH` 为已有中文字体路径。
工程不复制或分发 Windows 字体。
安装方法依据 [Manim 官方安装文档](https://docs.manim.community/en/stable/installation/linux.html);
中文排版采用 [Text / Pango](https://docs.manim.community/en/stable/reference/manim.mobject.text.text_mobject.Text.html)。
`uv.lock` 锁定 Python 依赖,系统开发库不由 uv 管理。
## 场景与输出
- `SlimeFilm`:15 个章节的完整动画。
- `ParallelEpisode`:任务、CPU、CUDA 按 seed 分工、按坐标分工、outer sum。
- `RandomEpisode`:Random 状态公式、归一化与窗口、low18、类缓存、预计算、组 mask、θ 高位求解、完整验证与效果。
```bash
uv run python render.py --scene ParallelEpisode --quality preview
uv run python render.py --scene RandomEpisode --quality final
```
预览为 854×480 / 15 fps,正式画质为 1920×1080 / 30 fps。
`output/` 中会生成 MP4、SRT、口播稿、章节时间轴、视频规格记录和章节缩略图。
`verify.py` 会逐帧解码视频,并核对分辨率、字幕时间轴和源码/测速数据哈希。
字幕已显示在视频画面中,SRT 另外供剪辑软件使用,导入时无需重复叠加。
`output/`、`.venv/` 与 Manim 中间产物已忽略,不应提交大量渲染缓存。
## 编辑入口与数据口径
`scenes.py` 定义动画、字幕与停留时间。每个 `say()` 同时记录字幕时间轴,修改口播时请在这里修改。
字幕支持中文与 LaTeX 行内公式混排:`say(caption, seconds, display=r"中文 $2^{48}$")`。中文使用 Pango,`$...$` 内的公式使用 `MathTex`;`caption` 保留口播文字,供 SRT 与配音稿使用。时间轴同时保存实际画面用的 `display`,便于核对。
前半段保留 CPU/CUDA 与计算复用的演进,A/B/C 各自比较相同任务。
后半段沿当前算法的数据流讲解,每章先说明解决的问题,再解释条件与实现,最后展示效果。
不加入固定 seed 的坐标余数对分支、未接入的补扫算法或全世界成本外推。
数学与当前实现说明见 [最终算法数学原理](../DOCUMENT.md)。
当前候选生成只覆盖普通分支;完整 Java 验证保证输出正确,尚未补回依赖拒绝重抽的全部解。
后半段与 [统一正文](../DOCUMENT.md) 使用同一条数值路径。公式与案例分开展示,案例使用黄色标签与引用线;不再使用临时假设的坐标项、输出差或高位参数。θ 与坐标项 T 分开,11 在基准状态中的去向单独展开。
`data/benchmarks.json` 冻结测量数据和本次实际使用的来源 SHA256:
- A/B/C:CPU → GPU、按坐标分工、outer sum;不同负载不连乘。
- ROOT:已知 5×5 窗口,262144 → 84 个低位根,11010048 → 36 个输出差幸存者。
- P/G:同一窗口预计算 0.323584 → 0.268288 ms,成组筛选再降到 0.156672 ms;两步合计约 2.07×。
- D:同窗口的输出差过滤+区间求交,63.750 → 约 0.324 ms;这是组合效果。
数据文件保留 E/F/CLI 等历史测量,当前影片不展示另一批坐标或 CLI 案例。窗口演算最终展示 25 格完整原始输出表,与开头 Java 代码相互对应。
P/G 包含每轮公共项准备,不包含低位根生成、初始化和传输。
不能把不同输入、版本或计时范围的倍数连乘为应用总加速。
`verify.py` 核对章节顺序、口播导出、字幕时间、来源哈希和各项实测数据,并逐帧解码 MP4。
数学式与同窗口演算另用 `uv run python check_lower35.py` 核验,包含完整 25 格输出、组掩码及全部 8192 个高位对照。
正式输出为 `output/SlimeFilm-final.mp4`;同名 `.srt`、`.narration.md`、`.timeline.json`、
`.render.json` 与 `-contact.png` 同步生成。