继续上一篇博客
上一篇博客已经讲述了unity中物理引擎的大部分物理特性,接下来介绍一些优化技术用于提升游戏的物理性能!
物理性能优化
场景设置
缩放
应该尽可能的将游戏世界的所有物理物体的缩放接近(1,1,1),默认情况下,unity假设试图模拟的游戏玩法相当于在地球表面,地球表面的重力为9.81m/s2,因此默认重力值设置为-9.81以匹配地球重力,unitu世界空间的一个单位等于1米,负号意味着他会把物体向下拉,物体的大小应该反应有效的世界尺度,因为缩放过大会导致重力移动物体的速度要比预期的慢得多,如果所有物体都放大五倍,那么会导致重力移动物体的速度比预期的要慢得多,反之亦然对象缩放太小会使他们看起来下降的太快,看起来不真实;
如果一些对象的比例值远高于(1,1,1)即使他们与隐含的世界缩放匹配,那么也会有不稳定的物理行为;
位置
同样保持所有对象在世界空间接近(0,0,0),将具有更好的浮点数精度,提高模拟的一致性,空间模拟器和自由运行游戏试图模拟非常大的空间,通常使用一个技巧,要么秘密的将玩家传送回世界的中心,要么固定他们的位置,在这种情况下,空间的任何一个体积都被划分,这样物理计算总是接近0的值来计算,或者移动其他对象来模拟旅行,而玩家的移动只是一种错觉;
大多数游戏都没有浮点不准确的风险,因为大多数游戏的管卡往往持续10-30分钟,左右,这不会给玩家足够长的事件进行荒诞的长途旅行,但是如果在整个游戏过程中处理超大的场景或者异步加载场景,一直到玩家走了数万米,就可能回注意到他们走到远处产生的一些奇怪的物理行为;
所以除非已经深陷于项目,以至于在后期改变和重新测试所有的东西都很麻烦,否则应该尽量使所有的物理物体接近(0,0,0)的坐标位置,另外它也可以更快的在游戏世界中找到物体和跳帧东西;
质量
正常情况下,可以自由选择值1.0代表任何内容,然后适当的而缩放其他值;
传统上,值为1.0的质量表示1Kg,但是可以指定一个人的质量是1.0(130KG),在这种情况下,一辆车的质量是10.0(1300KG),实际上最重要的是应该保持质量的相对差异,这样物体之间的碰撞看起来才更可信;
理想情况下, 质量值保持在1.0左右,最大相对质量在100左右,如果两个物体的碰撞质量比这个大得多,那么巨大的动量差回由于冲量变成突然的、巨大的速度变化,导致一些不稳定的物理现响和浮点精度的潜在丢失;
请注意,地球中心的重力对所有物体都有同等的印象,这和他们的质量无关,不需要调整重力来补偿,然而重要的是给定物体在下落时收到的空气阻力,因此为了获得逼真的行为,可能需要为这些对象自定义drag属性,或者基于每个对象自定义重力,比如说禁用UseGravity,并且在固定更新中自定义自己的重力;
适当的使用静态碰撞器
如果在运行时将新对象引入静态碰撞器,那么必须重新生成它,这可能回导致CPU峰值,所以在游戏中避免实例化新的静态碰撞器非常重要;
此外,移动、旋转、缩放静态碰撞器都会触发此重新生成的过程,也应该避免;
如果碰撞器希望在不与其他物体发生物理碰撞的情况下移动,那么应该附加一个righbody,使其成为一个动态碰撞器,并开启Kinematic标志,这个标志可以防止对象对来自对象的碰撞外部脉冲做出反应,但是对象扔可以通过Transform组件或者通过给tigibody施加的力进行移动
也正是这个原因,玩家角色经常被制作成为Kinematic碰撞器
恰当的使用触发器
触发器和碰撞器重要区别是OnCollider提供了一个Collision对象作为回调参数,它包含了精确的碰撞位置和接触法线,但是OnTrigger没有提供;
因此不要尝试使用触发器对碰撞做出反应,
触发器的使用场景:
当玩家停留在熔岩坑中处理伤害;
当物体进入一个建筑时触发一个场景,当玩家接近或者远离某个场景时启动另一个场景的异步加载;
优化碰撞矩阵

应该对碰撞矩阵中所有潜在的层组合执行逻辑健全性检查,一查看是否浪费宝贵的事件检查不必要的对象之间的碰撞,这几乎可以不费吹灰之力的释放一些CPU的周期
首选离散碰撞检测
离散碰撞检测的消耗非常低,因为只传送一次对象并在父进对象之间执行一次重叠检查;
连续碰撞检测的消耗就要大得多,因为它涉及到在两个对象的起始位置和结束位置之间插入两个对象,同时分析这些点之间可能发生的任何轻微的边界体积重叠,因此连续碰撞检测的消耗要比离散碰撞检测高出一个数量级;
而连续动态碰撞检测甚至要比连续碰撞检测还要高一个数量级;
因此,应该支持绝大多数对象采用离散设置,仅仅在极端情况下使用连续碰撞检测,只有在希望捕捉快速移动的动态碰撞器之间的碰撞情况下才应该使用连续动态设置;
修改固定更新频率
在某些情况下,离散碰撞检测在大范围内可能不够友好,也许整个游戏中包含了很多物理对象,但是离散碰撞检测根本无法捕捉足够的碰撞才保证产品质量,但是将一个连续碰撞检测设置于所有对象,对性能来说则太昂贵了,因此可以自定义物理时间步长,通过修改引擎检查固定更新的频率,为离散碰撞检测系统提供更好的捕捉此类碰撞的机会;
通过Edit->project setting->time->Fixed Timestep 属性或者通过Time.fixed DeltaTime属性来完成FixedUpdate的修改;
注意:
减小该值,意味着增加频率,将迫使物理引擎更加频繁的进行处理,从而使其更加容易的通过离散碰撞检测捕捉碰撞,当然,这回增加CPU成本,因为调用了更多的FixedUpdate回调,更加频繁的请求物理引擎进行更新;
增加这个值(减少频率),则更加不容易捕捉碰撞,实质上也会降低对象移动的最大速度,我们也可能开始看到物体以奇怪的方式改变速度,因为它本质上使物理行为不再那么类似现实行为;
未完待续…
个人学习记录;
本文介绍了Unity中物理性能优化的关键技术,包括场景设置如缩放、位置、质量等的合理配置,以及如何适当使用静态碰撞器、触发器和优化碰撞矩阵等方法来提高游戏的物理性能。
706

被折叠的 条评论
为什么被折叠?



