Unity物理引擎基础优化准则

物理引擎的核心概念

rigidBody,刚体,基本物理属性,有了这个组件,对象才有了质量等物理特性。

通过translate来改变物体位置是没有惯性的,只有对rigidBody使用AddForce的时候,才是模拟的真实的物理作用。

collider,物体之间的碰撞属性,或者说物体的表面物理属性。collider有很多种,要根据需要选择,一般以box collider为例说明。collider为物体提供了碰撞体积、碰撞触发器开关、物理材料等属性。如果开启了触发器开关,可以通过脚本定义碰撞行为。

Physic material,物理材料,这个是应用于collider的一种特殊材料,定义了另一些跟物体的物理表面相关的属性,比如摩擦力、弹跳等。如果没有指定物理材料,物体之间碰撞后将不会发生弹性交互。

 

 

关于layer:

 layer是为了处理collider而设计的东西,目的是为了减少不必要的碰撞检测。Unity维护一个N*N的矩阵,N就是layer的数量,通过设置这个矩阵,可以指定哪些layer之间需要检测碰撞,layer内部默认是要检测碰撞。例如,当舞台上的对象被分成两组A和B,当A与B之间不需要计算碰撞时,只要把矩阵对应位置的选框取消,就可以避免layer之间检测碰撞了,从而减少不必要的计算。

关于光源:

  1. 尽可能地少用;
  2. 尽可能地减小光照范围;
  3. 不要在update类的事件函数中使用光源;
  4. 光线照在mesh collider上非常消耗计算,好的做法是给对象建立一个基元collider来模拟网格形状;如果一定要在网格(Mesh)collider上打光照,最好让网格是凸的;
  5. 一定要明确光线需要打在什么物体上,而且一定要试着在光照函数里指定一个layer mask。注意,在光线函数里,你指定的不是一个layer id,而是一个bitmask;例如,你想要把光打在layer id为10的layer上,要指定的是1 << 10,而不是10;如果想把光打在除id为10以外的所有layer上,可以使用~符号。

定量分析:

系统的负载与光源的数量、光照距离大致成正比;

primative collider的性能要比mesh collider的性能好上一倍多;

关于2d与3d:

如果要做的游戏是2d或者2.5d,那么就用2d模板。否则,使用3d模板会极大地增加负载,完全是不必要的。

关于刚体:

刚体是实现物理交互的组件。没有添加rigidbody组件的对象被称为是静态碰撞,尝试移动静态碰撞对象是非常低效的,因为这会迫使物理引擎把整个物理世界重新计算一遍。测试表明,移动静态碰撞物体的负载是移动刚体的负载的几乎2倍还要多。

调整时间步长:

在时间管理里可以调整timestep,这个会直接影响FixedUpdate()和物理引擎的更新频率。通过适当地调整,可以在不影响体验的情况下增加timestep,以获得性能上的提升。

猜你喜欢

转载自blog.csdn.net/terminatorsong/article/details/124578956