性能基准
本页记录 RenMori 1.1.0 的性能基准结果:测试在真实的 Ren'Py 8.5.2 引擎中进行,以同一批资源分别构建未保护、基线保护与完整保护三种发行版构建,并通过引擎自身的资源加载路径 renpy.loader.load 读取全部资源后计时,因此测得的是实际发行的运行时开销,而非独立的加密库性能。
测试脚本为仓库中的 tools/benchmark.py,本页数据对应的原始结果见 docs/benchmarks/2026-10-31-apple-m1.json。
结论摘要
- 完整保护下,引擎内解密吞吐为 567 至 1529 MB/s,具体取决于单个文件的大小
- 读取一张 2 MB 的 CG,完整保护比未保护多耗时约 0.95 ms,作为参照,60 FPS 下的单帧时间为 16.7 ms
- 在视频中随机 seek 并读取 64 KB,完整保护的中位耗时为 0.086 ms
- 加载并解析全部脚本的
lint耗时由 0.52 s 增加到 0.67 s - 受保护构建的
game/目录体积仅增加 0.18% - 构建期保护 319 MB 资源,完整保护耗时约 13 s
测试环境
测试方法
工作负载
以 Ren'Py SDK 示例项目 the_question 为基础,向 game/ 中加入一组按商业视觉小说规模设计的合成资源,合计 812 个文件,加上示例项目自身后 game/ 目录共 319.3 MB;合成资源的内容为随机字节,与已编码的图像、音频、视频一样不可压缩。
测量项目
本页中的 MB 均指 220 字节。
结果
引擎内读取吞吐
单位为 MB/s,数值越大越好。
单文件读取耗时
单位为 ms,表示读取一个完整文件所需的时间。
视频不以整个文件为单位读取,而是由引擎流式读取,因此以下一节的延迟数据为准。
视频流式读取延迟
单位为 ms,取中位数。
脚本加载
the_question 包含 52 个已编译脚本,三种构建的差异均在 0.15 s 以内。
构建耗时与体积开销
构建耗时只发生在开发者机器或 CI 上,不影响玩家;完整保护由闭源插件完成,包含逐构建的结构多态等额外处理,构建耗时高于基线保护。
分块大小
以下数据在构建工具的 Python 中通过 cryptography 后端测得,用于比较 chunk_size 配置的取舍,不代表引擎内的绝对性能。
分块越大,顺序吞吐越高、体积开销越小,但随机读取需要解密的数据也越多;默认的 64 KB 在两者之间取得平衡,一般无需调整。
结果解读
完整保护使用闭源插件提供的原生运行时,是发行版构建的默认选项;基线保护使用 Python 编写的参考读取器,吞吐约为完整保护的 1/14 至 1/6,仅适用于无法使用插件的场景,详见 保护强度与闭源插件。
上表中「未保护」的数据接近内存拷贝速度,原因是测试时资源已位于操作系统的页缓存中;这一设置排除了磁盘性能的差异,使结果只反映解密本身的 CPU 开销;在玩家机器上,首次读取通常受磁盘速度限制,受保护与未保护之间的相对差距会相应缩小。
局限
- 未测量实际游玩中的帧时间;本页数据只覆盖资源读取与解密,不包括图像解码、音频解码与渲染
- 合成资源为随机字节,引擎只读取而不解码这些文件
- 测试在页缓存热状态下进行,未包含冷启动时的磁盘 I/O
- 仅在一台 Apple M1 设备上测试,Windows、Linux 与 Steam Deck 上的数据尚未测量
复现
需要 Ren'Py SDK 与 RenMori 源码仓库;完整保护需要闭源插件,首次运行时会自动下载。
不同设备上的绝对数值会有差异,比较时请以同一设备上三种构建之间的相对结果为准。