
超频 - 通用机械分叉
一个专注于性能的Mekanism分支,旨在降低大型基地的刻时间。优化了物品管道、能量/流体/化学网络、热量、数字采矿机以及辐射系统。可直接替换使用,兼容现有附加组件和存档。
Mekanism: Overclocked
Mekanism: Overclocked 是 Mekanism(由 Aidan C. Brady (bradyaidanc) 及贡献者开发)的一个非官方、注重性能的分支。 它不隶属于 Mekanism 团队,也未获得其认可。
- 原始模组:https://www.curseforge.com/minecraft/mc-mods/mekanism
- 原始源代码:https://github.com/mekanism/Mekanism
- 许可证:MIT(见下方许可证章节)
此分支与上游 Mekanism 的区别
Mekanism: Overclocked 保留了 mekanism 模组 ID 以及所有模块 ID,因此它是一个即插即用的替代品:现有存档无需更改即可加载,现有的 Mekanism 附属模组也能继续与之配合使用。
以下所有更改都是行为保持型的。机器、网络、配方和配置的行为与上游 Mekanism 完全一致;改变的是游戏为该行为所需承担的工作量。优化重点在于大型基地中每个游戏刻都会运行的系统(物品运输、线缆网络、热能、数字采矿机以及辐射),减少每游戏刻的工作量和短生命周期对象分配,可直接降低服务器刻耗时并减轻垃圾回收压力。
物品运输与寻路
物流运输器的寻路器和物品路由获得了最大程度的改动,因为它们在大型物品分类装置中运行频繁。
- 优先级队列 A* 算法:寻路器此前在每一步都会扫描整个开放式集合以寻找最低分节点,这是每个节点的 O(n) 扫描。现在它使用优先级队列,将每步成本降至 O(log n)。在大型运输器网络中,这大幅降低了重新计算路线的成本。
- 免分配节点遍历:搜索过程复用单个可变的方块位置,而不是为每个访问的节点分配一个新的位置对象,并通过比较平方距离来避免每个节点的平方根计算。
- 打包长整型位置查找:网络传输器查找和路径缓存现在使用打包的
long类型位置作为键,而不是BlockPos对象,从而消除了大量短生命周期对象的分配和映射键的哈希计算。路径缓存也迁移到了 fastutil 映射。 - 单次最佳路径选择:选择最便宜的目标不再需要构建和排序候选路径的完整列表;最佳路径在一次遍历中选出。
- 缓存路径索引:运输器堆栈会缓存其当前在路径中位置的索引,而不是在每个移动步骤中对路径执行线性的
indexOf扫描。 - 共享库存快照:在预测向某个对多个方向暴露同一处理器的库存进行插入时,库存只被读取一次并在这些方向之间共享,而不是为每个方向重新扫描。
- 传输循环中的惰性工作:每个游戏刻的运输器更新只在确实需要移除物品时才分配其“待删除”集合,在无拉取侧的运输器上完全跳过拉取逻辑,并且仅在玩家实际跟踪该区块时才构建客户端同步数据包。
线缆与管道网络(能量、流体、化学)
- 可重用分发目标:能量、流体和化学网络此前在每次发射时都会分配一个全新的分发目标(及其后备列表)。现在这些目标跨游戏刻复用,并在原位重置,从而消除了每个活跃网络在稳定状态下的每游戏刻分配。一个单元测试确认,重置并复用的目标与全新创建的目标分发结果完全相同。
- 热路径上的流式移除:传输器连接检查用普通循环替换了流/lambda 表达式,以避免在连接刷新期间为每个邻居产生分配。
热力网络
- 空闲热力网络休眠:热力学导体网络现在能够检测到何时达到热平衡(所有导体都处于环境温度且无待处理热量),并停止模拟,直到有扰动发生。添加或合并导体、相邻热源或任何实际进入网络的热量都会使其唤醒。此前每个热力网络每个游戏刻都会模拟其所有导体,无论是否有任何变化。
- 免分配邻接关系:导体之间的热传递使用打包的
long类型位置,而不是为每个连接的侧面分配一个方块位置。
数字采矿机
数字采矿机在后台线程上运行的方块搜索进行了重构,以减少扫描量并降低分配:
- 基于分条件缓存的逐方块判定:仅依赖于方块类型的过滤器评估对每个独特的方块计算一次并缓存,而取决于特定方块状态或位置(以及不可破坏和挖掘速度检查)的检查则仅在方块已匹配过滤器后才运行。
- 无逐位置分配:搜索过程在整个区域内复用单个可变方块位置,而不是为每个方块分配一个,并避免在过滤器匹配期间为每个方块分配一个物品堆。
- 更廉价的边界方块跳过:通过直接的方块类型检查(而非每位置图格实体查找)来识别边界方块。
- 空区域短路:如果搜索区域内所有已加载区块在挖掘 Y 范围内都是空的,搜索会立即退出,而不是遍历每个位置。区域缓存也会缓存其空区块占位符,而不是在每次查找时重新分配。
- 大区域安全性:使用
long类型数学计算区域大小并防止溢出,因此非常大的半径会干净利落地失败,而非静默地产生错误行为。
辐射系统
- 辐射源空间索引:辐射源按区块索引。计算某个位置的辐射水平仅检查附近区块中的源,而非遍历维度中的所有源;添加、移除和衰变操作直接在区块索引上进行。
- 闭式衰变时间:衰变时间计算用一个直接的对数公式替换了之前逐秒迭代直至强度降至阈值以下的循环,并正确报告非衰变配置为无限。
- 批量客户端同步:一个游戏刻内的辐射变化将受影响的维度标记为脏数据,并在该游戏刻结束时为每个维度发送一次客户端更新,而不是在每次单独变化时重新同步所有客户端。
- 无辐射时跳过工作:当没有环境辐射源且实体本身未受辐射时,逐实体的辐射处理会提前退出。
- 维度范围玩家迭代:客户端辐射更新仅迭代受辐射维度中的玩家,而非服务器上的所有玩家。
- 粒子上限:客户端辐射粒子生成在每个游戏刻设有上限,以避免在高配置值下出现病态数量的粒子。
渲染
- 免分配运输器渲染:物流运输器渲染器不再每帧分配一个列表、集合和位置数组。它复用持久缓冲区,使用可变查找键来去重相同的在途物品堆,并将堆位置写入共享数组。
兼容性
- 模组 ID 保持为
mekanism;模块 ID 保持为mekanismadditions、mekanismgenerators和mekanismtools。依赖 Mekanism 的附属模组将继续加载。 - 存档、配置(仍存储于
config/Mekanism/下)和配方保持不变。 - 所有优化都保留了现有行为。它们改变的是工作方式,而非机器和网络的功能。
许可证
Mekanism 采用 MIT 许可证 许可,Mekanism: Overclocked 完全遵守该许可证,并以相同的 MIT 许可证分发。原始作品的版权归 Aidan C. Brady 及 Mekanism 贡献者所有,原始的 LICENSE 文件未加修改地包含在本项目的源代码和分发文件中。请参阅原始项目:https://github.com/mekanism/Mekanism。
正在加载版本记录…
正在加载评论…
评论在新手盒子客户端中发表,这里同步展示。