slime/show/video/README.md

5.9 KiB
Raw Permalink Blame History

史莱姆搜索科普视频 · 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。 当前输出是带字幕的动画,没有配音或背景音乐;同步生成完整口播稿和 SRT 字幕。

环境与运行

需要 Python 3.12、uv,以及 Cairo/Pango 开发库。Ubuntu 常规安装:

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 官方安装文档; 中文排版采用 Text / Pango。 uv.lock 锁定 Python 依赖,系统开发库不由 uv 管理。

场景与输出

  • SlimeFilm:15 个章节的完整动画。
  • ParallelEpisode:任务、CPU、CUDA 按 seed 分工、按坐标分工、outer sum。
  • RandomEpisode:Random 状态公式、归一化与窗口、low18、类缓存、预计算、组 mask、θ 高位求解、完整验证与效果。
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 的坐标余数对分支、未接入的补扫算法或全世界成本外推。 数学与当前实现说明见 最终算法数学原理。 当前候选生成只覆盖普通分支;完整 Java 验证保证输出正确,尚未补回依赖拒绝重抽的全部解。

后半段与 统一正文 使用同一条数值路径。公式与案例分开展示,案例使用黄色标签与引用线;不再使用临时假设的坐标项、输出差或高位参数。θ 与坐标项 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 同步生成。