设置与性能
设置
在Forge版本的游戏中默认按下Alt+M
,你就能打开MadParticle Designer GUI
,找到设置
界面。
以下提到的所有设置项,在必要的情况下,都可以在.minecraft/config/MadParticleConfig.json
中手动更改。
最大粒子数量
滑块的数值范围是8192~262144。
在原版设定下,每种RenderType
各自的粒子数量最大为16384,而我们通常只使用有限的一两种RenderType
,在这种情况下使得世界内粒子最大数量相当于16384。在硬件性能更好的电脑上,16384个粒子可能并不会使FPS降低到令人无法接受的程度。MadParticle允许你自由调整此值。
MadParticle的最初设计应用是线上多人展会或类似场景,由于各个玩家硬件状况不同,在这种情况下:
- 如果粒子指定的渲染类型是
实例化
,我们建议将场景粒子总数控制在80000以内; - 如果粒子指定的渲染类型是
半透明
或不透明
,我们建议将场景粒子总数控制在8000以内。
始终限制最大生成距离
当粒子生成时,其与摄像机的距离将有两道阈值:
- 普通最大生成距离:视距的一半,只有始终渲染为
true
的粒子可以在这个距离外生成; - 强制最大生成距离:视距的两倍,当始终限制最大生成距离为
是
时,即使是始终渲染为true
的粒子也不能在此距离外生成。反之为否
时,你可以把这个距离等效于∞。
辅助线程数
循环按钮的排列顺序为仅主线程
(值为1)、6
、4
、8
、12
、2
。默认值为4
。如需要其他值,请直接修改配置文件。
指定有多少辅助线程将被用于辅助计算,通常推荐这个值略小于你的CPU核心数量。
- 大于核心数时辅助线程之间会产生竞争,从而使得效率降低;
- 等于核心数时,
- 后台的其他程序可能会与Minecraft产生竞争,影响后台程序运行;
- Minecraft切换到主线程所花的时间可能会更久,使游戏帧数产生明显波动,故只推荐用在追求最高效率的固定场景;
上文提到的”CPU核心数量“不考虑超线程技术,仅指物理核心。
对于混合架构用户,目前MadParticle还做不到区分大小核并智能分配任务,您可能需要手动指定Minecraft仅在大核上运行。在这种情况下,你可以将辅助线程数指定等于您的大核(P-core)数量。
服务端解析/mp
指令所使用的多线程不受此限制。
接管粒子渲染
循环按钮为不接管
、仅原版
、原版及其他Mod
。默认为仅原版
。
- 设为
仅原版
时,MadParticle会把大部分原版粒子的渲染方式修改为实例化
,从而极大地提升性能; - 设为
原版及其他Mod
时,MadParticle会把所有渲染类型为半透明
或不透明
的粒子修改为实例化
。这会使得一些具有特殊渲染的粒子不再遵循其自身的渲染逻辑,因此一般不建议使用。
接管粒子计算
循环按钮为不接管
、仅原版
、原版及其他Mod
。默认为原版及其他Mod
。
- 设为
不接管
时,粒子计算(tick)将按原版逻辑在主线程中执行(包括MadParticle粒子); - 设为
仅原版
时,全部原版(除非我找漏了)粒子和MadParticle粒子的计算将会并行化,从而提升性能。由于需要额外过滤其他Mod粒子,性能会略低于原版及其他Mod
模式; - 设为
原版及其他Mod
时,全部粒子计算将会并行化,按辅助线程数分摊任务。通常情况下不需要额外关心,如果有其他Mod粒子产生错误从而需要特别地将其调回主线程,你可以手动选择仅原版
。
性能:原理
游戏帧率会受硬件性能、运行环境、软件性能、设置选择、实际场景等许多方面影响。
1.1 实例化
实例化渲染(Instanced Rendering)使得CPU-GPU通信几乎完全不再是渲染瓶颈,能在有大量重复元素时提高帧率。简单来讲,原版粒子的渲染方式逐个地把粒子的数据发送给GPU,有多少粒子就发多少次;实例化渲染是一次性把所有的粒子的数据都发送给GPU,无论多少粒子都只用发一次。
你可以把粒子命令中的渲染类型设为实例化
来启用此技术。
我们也支持把原版粒子或/和其他Mod的粒子渲染类型从半透明
或不透明
的粒子修改为实例化
。这会使一些具有特殊渲染方法的粒子不再执行其本身的渲染方法,我们已经对原版粒子做了过滤,但对其他Mod的粒子暂时没什么好办法。如果你能容忍其他Mod的粒子的画面错误那你可以把仅原版
改为原版及其他Mod
以获得最大效率。
以下是可以进行实例化渲染的粒子列表,不在此列表内的粒子不进行实例化渲染:
(此列表可能不会得到及时更新,故可能与实际实现有偶尔出入。)
SnowflakeParticle,
SpitParticle,
SpellParticle,
HeartParticle,
BubbleParticle,
BubbleColumnUpParticle,
BubblePopParticle,
CampfireSmokeParticle,
PlayerCloudParticle,
SuspendedTownParticle,
CritParticle,
WaterCurrentDownParticle,
DragonBreathParticle,
DripParticle,
DustParticle,
EnchantmentTableParticle,
EndRodParticle,
FallingDustParticle,
WakeParticle,
FlameParticle,
SoulParticle,
SculkChargeParticle,
SculkChargePopParticle,
LargeSmokeParticle,
LavaParticle,
NoteParticle,
ExplodeParticle,
PortalParticle,
WaterDropParticle,
SmokeParticle,
SplashParticle,
TotemParticle,
SquidInkParticle,
SuspendedParticle,
ReversePortalParticle,
WhiteAshParticle,
GlowParticle
1.2 并行填充
既然是一次性发送所有粒子的数据,那自然需要CPU先把这些数据填入缓冲区。在消除CPU-GPU通信瓶颈之后,影响帧率的主要瓶颈就是CPU进行各类运算所花的时间。
很幸运地,我们可以便利地利用所有能用的CPU核心来执行填缓冲区的任务而不需要考虑经典的多线程同步/阻塞问题,这使你在上文中选择的辅助线程数对这项工作可以有几乎线性的影响——两个核心需要原来一半的时间,32个核心就只需要原来1/32的时间。当然,如果你的CPU确实有这么多核心,那内存和CPU-GPU带宽可能会成为新的瓶颈。