
星光
光照计算速度提升了两倍,区块构建速度提升49%,探索更流畅,卡顿显著减少。
📖 概述
这是一个客户端光照计算优化模组,通过缓存光照查询结果、优化区块构建时的数据读取路径,并与 Sodium Dynamic Lights 集成以消除冗余计算,从而降低区块加载、相机旋转和大规模方块变动期间的 CPU 开销。
简而言之:光照计算速度提升一倍,区块构建速度提升 49%,探索过程更流畅,卡顿显著减少。
✨ 关键成果
基于 120 秒 Spark A/B 测试,唯一变量为是否安装 LightStar:
| 指标 | 未安装 Lightstar | 安装 Lightstar | 提升幅度 |
|---|---|---|---|
| 光照计算总耗时 | 基准 | -52.5% | 2 倍速度 |
| 光照处理吞吐量 | 1.0x | 2.1x | +110.5% |
| Embeddium 区块构建吞吐量 | 1.0x | 1.49x | +49% |
| 动态光照查询耗时 | 82.3 秒 | 0.05 秒 | -99.94% |
测试结果来自两个测试组(开启/关闭光影)的等权平均值。
测试配置: AMD Ryzen 9 9950X3D + NVIDIA RTX 4080 Super OC。实际使用中,中低端配置将体验到更为显著的提升。
🎯 预期收益
- 减少 Embeddium 异步区块构建过程中的冗余光照查询、坐标转换和数组清理操作。
- 减少重复采样同一位置时的哈希查找和数组访问次数。
- 复用相同不可变区块快照的静态光照结果,降低重复区块构建的成本。
- 阻止不支持 Forge 外部面剔除的方块进入相邻面剔除查询流程。
- 安装 Sodium Dynamic Lights 后,减少动态光照查询时的冗余遍历、读写锁竞争和线程局部状态开销。
⚙️ 实现细节
光照缓存
采用 4 路组相联的线程局部原始类型缓存存储近期光照值,并为最近访问的位置增加了单条目快速路径。光照更新会使数值代际计数器递增,立即使旧结果失效。DataLayer 半字节读取使用直接索引和位运算,减少热路径上的辅助方法调用和乘法运算。
Embeddium 区块构建
- 单次遍历即可读取方块光和天空光,消除了对同一坐标的第二次区块段查找。
- 方块光固定于低 4 位,天空光固定于高 4 位,不再依赖枚举排序。
- 使用 16 位代际数组,而非为每个构建任务清零全部 8000 个缓存槽位。
- 为克隆的不可变区块段分配数值修订号;仅当世界、原点及所有区块段修订号匹配时才复用跨任务缓存。
- 跨任务缓存采用访问顺序淘汰策略,并在玩家登录/退出世界时清空。
Sodium Dynamic Lights 集成
- 动态光照查询状态和包含 4096 个条目的 4 路组相联缓存直接由
ArrayLightDataCache实例持有,消除了ThreadLocalMap查找。 - 每个构建任务开始时,在 SDL 读锁下复制动态光源引用的快照。任务内的查询直接遍历此快照,避免了每次采样时获取
ReentrantReadWriteLock。 - 光源更新会使代际计数器递增;移动中的光源永远不会写入持久缓存,也不会留下静态残影。
- 非区块构建路径保留完整的 SDL 回退行为,以确保兼容性。
⚠️ 不兼容项
- Starlight — 不兼容。
- Sodium/Embeddium Options API — 不兼容。此模组没有实际用途,并且不是 Sodium Dynamic Lights 的必需依赖项。
正在加载版本记录…
正在加载评论…
评论在新手盒子客户端中发表,这里同步展示。