跳转至

附加包性能优化

基岩版的玩家群体横跨多种平台,涵盖高端主机与入门级移动设备。一个技术上出色的附加包,如果在低性能设备上造成明显卡顿,其价值便大打折扣。因此,将性能意识贯穿于附加包开发的各个阶段,是负责任的开发者的应有之义。

注意

本页内容主要来自社区实测与经验总结,部分结论可能因版本、设备或具体配置不同而存在差异。不应将这里的任何建议视为绝对规则,始终应以实际设备测试为准。

生物群系与地物

生物群系

  • 生物群系系统本身的性能开销相对可控。
  • 高度图中设置较大数值通常不会造成明显问题。
  • climate组件可能引发大规模粒子风暴,应谨慎使用。

地物

  • 地物放置通常比生物群系本身更容易引发延迟。
  • 每区块多方块地物执行数百次迭代的性能开销可以接受。
  • 每区块多方块地物执行数千次迭代会对游戏体验产生负面影响。
  • 每区块单方块地物执行数十万次迭代的性能开销同样可以接受。

方块

材质

  • 始终选用能实现目标效果的最低开销材质:
  • 半透明(alpha blend)开销高于透明镂空(alpha test),后者高于不透明(opaque)。

数量与类型

  • 应尽可能减少流动液体的数量。

更新

  • 应尽量减少方块更新的频率与范围。

命令

数量与类型

  • 尽量减少每刻运行的命令总数。
  • 每刻都执行/effect/gamemode对性能影响显著,应当避免。
  • 应避免在运行时执行大范围克隆(clone)或填充(fill)操作。
  • 如有必要,可将大操作拆分为多个较小的命令,分散到多个刻执行,以避免卡顿尖峰。

目标选择器

  • 确保函数不会在过多的实体上同时执行,导致命令被重复调用过多次。
  • 执行一次记分板命令的开销高于多次解析同一目标选择器;合理权衡。
  • 使用c=1可让选择器在找到第一个目标后停止,有助于提升性能。
  • 若需以同一选择器执行多条命令,将其整合为函数可避免反复解析选择器。

标签与记分板

  • 在大规模状态管理场景下,记分板的性能优于标签。

实体

实体在各子系统中往往是性能开销最大的来源,应尽量减少加载实体的总数。

组件

  • 飞行生物的寻路有显著性能开销。
  • 飞行生物总体上容易出现性能问题,如有可能,可考虑用动画模拟飞行效果代替真实寻路飞行。

虚拟实体

  • 虚拟实体的性能开销与普通实体基本相当,但移除寻路等重量级组件后开销会有所降低。

几何体

  • 骨骼(Bone)数量目前未观察到对性能有显著影响。
  • 元素(Element)数量通常不是问题,但在极端情况下(数千个元素)会产生影响。

材质

  • 同样地,始终选用能实现效果的最低开销材质。如有疑问,可参考引擎材质定义文件,了解各材质的继承链与开销差异。

数量

  • 任意时刻已加载的实体总数应尽量控制在30个以内,以获得最佳性能表现。

亮度

地图考量

  • 密封空洞区域会因亮度计算而引起延迟——建议填充无用的封闭区域。
  • 将世界时间锁定为白天或夜晚可避免动态亮度重算。

光源

基岩版的亮度是动态计算的,不同光源的性能开销不尽相同:

光源 综合评分 红石更新 动态纹理 亮度更新 刻更新 粒子 渲染
光源方块 1
自定义方块(无特殊逻辑) 2
蘑菇 3
红石灯 3
荧石 3
灯笼 4
海晶灯 4
火把 4
红石火把 5

评分越低,性能开销越小。光源方块开销最低(无粒子、无渲染、无刻更新);红石火把开销最高。自定义光源方块(极少组件)是性能与美观的合理折中。

Molang

递归

  • 尽量减少递归的使用,尤其避免深层嵌套循环结构。
  • 在循环中尽量使用break提前退出。

结构体

  • 避免创建过深的结构体,每增加一层都有相应的性能开销。

变量

  • 优先使用临时变量(temp.),以减少常驻内存的变量数量。
  • 考虑不同变量的计算频率——明确它们在哪类脚本中被计算,按需决定是否缓存。

纹理

数量

  • 使用的纹理总数不应超过3000张。
  • Render Dragon的纹理上限为4096张,而原版本身约占用800张(基于1.16时的数据)。

分辨率

  • 单张纹理的最大分辨率为16384×16384。
  • 建议最大分辨率为4096×4096,以保持与低端设备的兼容性。
  • 注意纹理会被打包进图集,过大的纹理可能影响低端设备的图集生成。
  • 纹理分辨率应按实际所需的细节程度设置,避免无谓地放大。

声音

数量

  • 已注册声音的总数据量据报道会对性能有影响。

压缩

  • 声音压缩对包体积有极大益处,在旧设备(如Nintendo Switch)上尤为明显。
  • 基岩版使用的FMod简单API会在加载时将所有音频解压为WAV格式再载入内存,因此压缩本身不带来CPU端的性能提升——但若采用流式播放(Streaming),则不会发生此类解压行为。

流式播放

  • 一般而言,体积超过500 KB或时长超过1分钟的声音应设置为流式播放。

红石

跨区块边界

  • 应避免红石电路跨越区块边界传输信号。

命令方块

  • 构建大型命令方块链时,应尽量在单个区块内垂直排列。
  • 在可以使用函数或行为替代的地方,尽量减少命令方块的数量。

常加载区域

  • 区块总数比常加载区域的数量更值得关注。
  • 除非必要,应避免使用动态常加载区域。
  • 最佳实践是将常加载区域缩减至一个区块——将所有需要持续运行的红石逻辑集中于此。
  • 在不再需要时及时卸载常加载区域(可通过/testforblock等命令检测条件后执行卸载)。