Engine Internals
基本信息
light/engine/ 下三个包私有的引擎支撑类:面遮光查表、线程安全方块访问、
RGB BFS 队列编码。三者都不直接注册内容,但决定了引擎的行为边界。
| 类 | 文件 | 行 | 可见性 |
|---|---|---|---|
FaceOcclusion |
light/engine/FaceOcclusion.java |
258 | public final class,工具类(私有构造) |
SafeBlockAccess |
light/engine/SafeBlockAccess.java |
86 | public final class implements IBlockAccess |
PackedColorLightQueue |
light/engine/PackedColorLightQueue.java |
50 | final class(包私有) |
FaceOcclusion:面遮光查表
用 long[] 位图缓存「某 blockId 的某 meta 某朝向是否不透明」:
| 项 | 值 |
|---|---|
| 每 blockId 位数 | meta * 6 + axisDir,meta 0–15、方向 6 个 → 96 bit |
| 存储 | long[2](bitIndex >> 6 选字,1L << (bitIndex & 63) 选位) |
| 方向序 | AXIS_TO_FORGE:EAST/WEST/SOUTH/NORTH/UP/DOWN |
isFaceSolid(faceBits, meta, axisDir) 在 faceBits == null || meta > 15 时
返回 true(不透明) —— 查表只覆盖 meta 0–15,超出范围只有
Face Light Occlusion 实现方能逐面控制。
Tables(faceSolidity + sidedTransparency)整体挂在一个
private static volatile Tables TABLES 字段上,
源码注释:rebuild 时整体替换以原子发布。
吸收解析顺序(源码注释 Full absorption resolution):
缓存的非方向值 > PositionalColoredTranslucency 接口 > 逐面透明 > registry/vanilla
resolveScalarAbsorption 是其标量对应物,只用原版 opacity 与面检查,
不查 TranslucencyRegistry。
NOT_SIDED(new long[0])用来区分「无逐面门控」与
「FaceLightOcclusion 实现方的 null 返回」两种语义。
SafeBlockAccess:线程安全的 IBlockAccess
把区块查询改道到 Supernova 自己的 copy-on-write 地图
SnapshotChunkMap,而不是 ChunkProviderServer,
以避免工作线程碰到区块提供者的内部结构。
对未加载区块的返回值一律是「空气 / 0 / null」,且不触发加载:
| 方法 | 未加载时返回 |
|---|---|
getBlock |
Blocks.air |
getBlockMetadata |
0 |
getTileEntity |
null(无条件,与是否加载无关) |
getBiomeGenForCoords |
BiomeGenBase.plains |
getHeight |
256 |
isSideSolid |
调用方传入的 _default |
getLightBrightnessForSkyBlocks |
原样返回 lightValue |
isBlockProvidingPowerTo |
0 |
getTileEntity无条件返回null:引擎需要 TileEntity 的发光时走 Dynamic Emission Snapshots 的主线程采样, 工作线程永不读 TileEntity。
SafeBlockAccess 持有 final class,构造参数只有 SnapshotChunkMap。
PackedColorLightQueue:RGB BFS 队列位布局
单个 long 同时编码坐标、三通道颜色、方向与三个标志位:
| 位 | 内容 |
|---|---|
| 0–5 | x(6 bit,相对缓存中心,0–63) |
| 6–11 | z(6 bit) |
| 12–27 | y(16 bit,为 cubic-chunks 预留) |
| 28–31 / 32–35 / 36–39 | R / G / B(各 4 bit) |
| 40–45 | 方向位集(6 bit) |
| 46–60 | 未用(15 bit) |
| 61 | FLAG_WRITE_LEVEL |
| 62 | FLAG_RECHECK_LEVEL |
| 63 | FLAG_HAS_SIDED_TRANSPARENT_BLOCKS |
encodeQueuePackedRGB / decodeQueueRGB 互为逆运算,
两者都只是位重排(0x0R0G0B 通道间隔 8 bit ↔ 队列位 28/32/36 间隔 4 bit),
不改变数值。
channelMaskWhereGt(a, b) 返回逐通道掩码:a > b 的通道得 0xF,
其余得 0x0,用于「递减传播」中识别还有别的光源贡献的通道。
实现借助 PackedColorLight.SPACER_BITS 做无借位的并行比较。
相关条目
- RGB Engines — 唯一用到
SafeBlockAccess/ 队列编码的引擎 - Scalar Engines — 标量路径不碰这三者
- Face Light Occlusion
- Dynamic Emission Snapshots
源码
src/main/java/com/mitchej123/supernova/light/engine/FaceOcclusion.javasrc/main/java/com/mitchej123/supernova/light/engine/SafeBlockAccess.javasrc/main/java/com/mitchej123/supernova/light/engine/PackedColorLightQueue.java