在我的roblox游戏中,你使用火箭发射器来摧毁零件,但是当同时计算大量零件时,它会对所有基于物理的物品(包括所需的游戏物品,例如炸弹)造成巨大的滞后。我尝试过使用 SetNetworkOwner 将项目分配给服务器,但这只会让事情变得更糟。
如果没有直接的解决方案来降低延迟,有没有办法对物理计算进行分组以将核心物品与可破坏物品分开?
导致零件抛掷的代码:
part:BreakJoints()
part:ApplyImpulse(((part.Position - explosion.Position).Unit * BLAST_FORCE.Value * part:GetMass()))
虽然许多部件爆炸并失去锚定总会因物理计算而导致滞后,但它们是提高体验物理性能的方法。
从技术上讲,你可以让这些部件消失,这会影响玩家的体验。即使消除了碰撞计算等其他因素,它也会因物理原因而受到影响。
提高物理性能的一种方法是使用自适应时间步进,它通过更改特定物理计算的物理频率来提高物理性能。
默认情况下,Roblox 以 240 Hz 模拟物理。给定每秒大约 60 帧的周期,每帧前进大约 4 个世界步。通过自适应时间步长,物理引擎通过改变模拟时间步长将零件自动分配给三个“解算器岛”,重点是 60 Hz 以获得最佳性能。然而,“更难”解决的部分将使用更快的时间步长(如 240 Hz)来确保物理稳定性。
还需要注意的是,如果您想要爆炸或物理的准确性,自适应时间步长并不总是合适。
自适应时间步进可以将物理性能提高高达 2.5 倍,在大多数情况下建议使用。但是,某些体验应使用固定模式 (240 Hz),包括:
需要高精度模拟和稳定性的体验,例如赛车游戏、“破坏”模拟或坦克等复杂机制的游戏。
FallenPartsDestroyHeight
,它决定了零件被破坏时掉落的高度。如果有很多零件从地图上掉下来,这尤其有用,因为可以更快地移除这些零件,从而减少物理计算和总体滞后。
此属性确定 Roblox 引擎通过将父级设为 nil 来自动从工作空间中删除掉落的 BasePart 及其祖先模型的高度。这是为了防止已经从地图上掉落的部件继续永远掉落。
您可以在体验中为模型、零件和网格正确设置物理和渲染参数,以提高性能。重要属性包括 CanCollide、CanTouch 和 CollisionFidelity。虽然它们是影响性能的更多属性,但这些属性对于物理来说是最重要的。如果您想了解更多为什么这些属性对物理学很重要,请单击文档原因链接。
对于较大的地图,可能更适合使用实例流来仅显示对玩家重要的部分,而不需要让他们渲染地图上的一些掉落部分。
体验实例流允许 Roblox 引擎动态加载和卸载世界各地的 3D 内容和相关实例。这可以通过多种方式改善整体玩家体验。
从本质上讲,流媒体所做的只是将游戏世界的一部分加载给玩家,而不是加载整个世界,从而由于不需要渲染太多而提高性能。请注意,这通常适用于较大的地图,因为加载新区域确实需要时间,并且如果玩家向未加载的区域发射火箭,则会导致一些问题。
有关优化的更多内容,我建议您阅读性能优化和物理计算优化,其中提供了有关如何提高体验性能的全面概述。
我上面列出的步骤非常笼统,但为您提供了有关如何提高物理性能的良好资源,而无需深入了解您的经验来查找根本原因,例如使用 MicroProfiler 来查找哪个物理步骤造成的影响最大滞后以及哪个程序集导致了该滞后,或者使用 Developer Console 来可视化哪些物理正在被大量计算。
我希望这个解释对您有所帮助,如果您对我的答案有任何疑问或问题,请随时评论出来,我将根据需要编辑我的答案或在评论中进行澄清。