创建高效视觉内容

创建高效视觉内容

创建工厂仪表客户端优化,基于飞轮

创建

本模组对机械动力(Create)工厂表计(Factory Gauge)的渲染进行了一项低垂果实(易实现且收益明显)的优化。

为何原本很慢

工厂表计是一个方块实体,基础模组的渲染器每帧都会对表计路径(gauge paths)执行顶点变换。考虑到路径在帧间几乎不变,这种做法的开销非常高。现有的方案(如 createbetterfps、Flerovium)并未改变这种即时模式(immediate mode)模型;本模组利用飞轮(Flywheel)来提供实例化(instancing)渲染支持。

局限性

  • 物品可能带有自定义渲染器。这些物品将回退到慢速渲染路径。
  • 本模组仅限客户端使用。它不优化服务端刻(tick)。
  • 本模组是针对机械动力工厂表计渲染的临时性、低垂果实式优化。它并非全面提升 FPS 的完整解决方案。
  • 本模组优化 CPU 帧时间的程度多于 GPU 帧时间。如果使用光影(shader),提升幅度可能较小。

评估

受控场景评估: 在超平坦世界中,一面 10x30 的墙上,每个方块有 4 个表计。在 Sparkc 性能分析器中显示出显著改进。结果见下图。

一张深色主题性能分析器对比图,标注为“之前”和“之后”。在“之前”部分,机械动力模组的工厂面板渲染主导了调用树,SafeBlockEntityRenderer.render() 和 FactoryPanelRenderer.renderSafe() 消耗了约 80.72% 的渲染时间;主要子调用包括 FactoryPanelRenderer.renderPart() 占 51.39%,一个缓冲区渲染调用占 30.67%,以及数值盒物品渲染约占 28%。在“之后”部分,相同的渲染路径出现在 Minecraft 正常的关卡渲染管线深处,仅占总时间的约 0.59%,回退表计渲染器约占 0.51%,展示了渲染成本的显著降低。

真实场景评估: 在一个参考性的 80 小时以上的生存世界中,同一位置站立不动。关闭垂直同步(VSync),无帧数上限,使用钠(Sodium):CPU 渲染提前 1 帧,Photon 光影超级预设。预热后,PresentMon 显示(10 秒间隔):

指标 未安装 已安装 变化
平均帧间隔 MsBetweenPresents 11.291 ms 10.618 ms 减少 0.673 ms,约 5.96%
对应吞吐量 88.57 FPS 94.18 FPS 提升约 6.3%
p50 帧间隔 10.644 ms 10.252 ms 减少约 3.7%
MsGPUTime 11.290 ms 10.617 ms 减少 0.673 ms
MsGPUBusy 10.802 ms 10.498 ms 减少 0.304 ms,约 2.8%
MsGPUWait 0.489 ms 0.120 ms 减少 0.369 ms,约 75%
MsGPULatency 12.594 ms 14.526 ms 增加 1.932 ms
MsInPresentAPI 0.124 ms 0.109 ms 两者都非常小
PresentMon 报告的 CPUUtilization 29.10% 20.16% 减少约 31%