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 做无借位的并行比较。

相关条目

源码

  • src/main/java/com/mitchej123/supernova/light/engine/FaceOcclusion.java
  • src/main/java/com/mitchej123/supernova/light/engine/SafeBlockAccess.java
  • src/main/java/com/mitchej123/supernova/light/engine/PackedColorLightQueue.java