
删除
受诅咒的、高性能视锥体逻辑,用于重度剔除场景
此项目代码借助人工智能协助创建。
一个开源模组,采用高效且带点“魔性”的视锥体逻辑,适用于实体密集的场景。**能提升 FPS,但会有一些副作用**。
优势
- 剔除屏幕外的实体:
- 在各种高负载场景中帮助**提升 FPS**(例如 CounterMine 2)。
- 与 **Entity Culling**、**Sodium** 模组配合时,加速效果**提升 x2**,因为它们在剔除方面是专业的。
缺点
- 屏幕外的实体会立即消失。
- 在其他场景中无效:
- 实体数量较少时
- 实体位于墙壁后方时。
- 在单人游戏中效果不佳。
- **增加 CPU 负载。**
基准测试
默认 1.21.11 Fabric 版本
之前:**无模组**
之后:**使用 LCull**

1.21.11 Fabric 带模组:Sodium、Entity Culling、Fabric API
之前:**不使用 LCull**
之后:**使用 LCull**

我为什么制作这个模组?
Minecraft 在渲染循环中会保留所有已加载的实体,即使它们在你的背后或远在屏幕之外,导致 GPU 和 CPU 为这些你永远看不到的东西付出全部代价。在实体密集的场景中,例如 RPG 模组服务器、小游戏大厅或拥有高达 10000 个实体(或大量展示实体)的 CounterMine 地图,这种开销会转化为实际帧率的损失。Sodium 和 Entity Culling 已经在方块和实体方面做了出色的工作,但我想要一个专门为屏幕上同时有数千个实体而调优的小型、专注的视锥体路径,以及一个干净的实验渲染管线的场所。LCull 源于 Lomka(我早期的工作,证明了 tick 和刷新剔除有很大帮助)中的想法,并将范围缩小到一个任务:停止绘制不在视锥体内的实体。
LCull 的视锥体检查是如何工作的?
每帧游戏都会为当前相机构建一个视锥体。LCull 向该视锥体询问实体的轴对齐边界框是否位于可见体积内,使用与渲染器用于区块相同的“盒体-视锥体”测试。当整个盒体都在外部时,该实体在渲染期间会被跳过,永远不会进入绘制调用。棘手的部分是稳定性:当你移动、改变 FOV 或调整窗口大小时,视锥体会稍有变化,而简单的检查会使实体在屏幕边缘闪烁。为避免这种情况,LCull 为每个实体保留了一个小的上一次剔除决策缓存,并且仅在相机上下文稳定几 tick 时才翻转该决策。缓存键是量化的相机位置加上视图方向再加上实体位置,因此微小的相机抖动不会使结果失效。这种迟滞特性实现了平滑剔除,而无需每帧重新评估每个实体。
Minecraft 和 LCull 的问题是什么?
Minecraft 确实将其自身的视锥体应用于区块和方块实体,但逐实体渲染循环仍然会遍历并提交所有已加载的实体,这正是屏幕外怪物与屏幕上的怪物开销相同的原因。LCull 移除了这种屏幕外开销,但无法移除隐藏在墙后的实体,因为那需要遮挡剔除和可见性图,这比视锥体测试困难得多。当只有少数实体或在单人游戏中(模拟而非渲染是瓶颈)时,该模组也毫无用处。由于剔除是在渲染线程上决定的,实体可能在离开视野的瞬间就突然消失,这是为了 FPS 提升而有意做出的权衡,并且它以少量额外的 CPU 工作换取视锥体评估。还有一个狭窄的兼容性边缘情况:假设每个实体每帧都被“渲染”的模组可能会表现异常,这就是为什么 LCull 保持为可选、可调的调整,而不是静默的覆盖。
链接
正在加载版本记录…
正在加载评论…
评论在新手盒子客户端中发表,这里同步展示。