物理最佳实践

首先附原文链接:https://unity3d.com/cn/learn/tutorials/topics/physics/physics-best-practices?playlist=30089

                                        物理最佳实践

        在本课中,我们将寻求一些在游戏中使用物理的最佳实践,以及一些证据来证明为什么要使用它们。


        层和碰撞矩阵

        所有的游戏对象(如果没有配置),都会被创建在默认层,在这个层默认所有的物体都会跟所有的物体碰撞。这是非常低效的。建立什么应该与什么相碰撞。为此,您应该给不同类型的游戏物体指定不同的层。每多一个新层,在碰撞矩阵上就会新增加一行和一列。这个矩阵负责定义层与层之间的交互。默认情况下,当增加一个新层的时候,碰撞矩阵会设置新层与其他存在的层都可以发生碰撞。所以开发者有责任访问它并建立其交互关系。通过正确的设置层与碰撞矩阵,您将避免碰撞监听器发生不必要的碰撞和测试。为了证明这个目的我制作了一个小的demo,我在盒子容器内生成了两千个物体(1000红色和1000绿色)。绿色的物体只和它们自己和容器壁交互,红色也一样。在其中一个测试中,所有的实例属于默认层,由碰撞监听器比对游戏对象的string类型的tag来进行交互。在另外一个测试中,每个物体的类型设置了其对应的层,我通过碰撞矩阵配置了每个层的交互。在这种情况下不需要字符串检测,因为只会发生正确的碰撞。

        图1:碰撞矩阵配置(图片见原网页)

        下面的图片取自demo,它有一个简单的管理器能统计碰撞的次数并在五秒后自动停止。当使用同一个层的时候不必要的多余的碰撞发生的次数非常可观。

        图2:碰撞数量超过5秒(图片见原网页)

        对于更具体的数据,我也在物理引擎上捕获了分析器数据。

        图3:一个层vs分离层物理分析器数据(图片见原网页)

        正如我们从分析器数据所见,使用一个层(平均〜27.7毫秒),分离层(平均〜17.6毫秒),CPU在物理上的花费相当不同。


射线

        射线是物理引擎上一个非常有用且功能强大的工具。它允许我们在一个确定的方向上以一个确定的长度发射射线,它可以让我们知道射线是否触及某物。然而,这是一个昂贵的操作,它的性能受场景中射线的长度和碰撞体类型高度影响。

        在使用它时这里有一些提示。

        1.这一点非常明显,但是还是要说,使用最少量的射线来完成工作。

        2.不要将射线的长度超过需要的长度。射线越长,需要检测的对象越多。

        3.不要在FixedUpdate()函数内使用射线,有时甚至在Update()内部使用Raycasts可能会矫枉过正。

        4.注意你正在使用的碰撞体的类型。对网状物碰撞器发射射线非常昂贵。

        ——一个好的解决方案是创建一个具有简单碰撞器的子物体,尝试贴近网格的形状。父刚体下所有的子碰撞体表现为一个复合碰撞体。

        ——如果迫切需要使用网格碰撞器,至少把它设置为convex(突出)。

        5.具体说明射线应该击中什么,并尝试在射线函数中指定一个层蒙版。

        ——这在官方文档中有很好的解释,但是您在射线函数中指定的不是层ID,而是位掩码。

        ——所以如果你想要一个射线击中一个id为10的层上的对象,你应该指定的是1 << 10(比特移位“1”到左边10x)而不是10。

        ——如果你想让射线击中除了第10层以外的所有东西,那么只需使用按位取反运算符(〜)来反转位掩码上的每一位。

        我开发了一个简单的demo,一个物体发射只与绿色盒子发生碰撞的射线。

        图4:简单射线演示场景(图片见原网页)

        在这里我修改射线的数量和长度来获取分析器数据,佐证我在上文写到的。我们可以从下面的图形中看到射线的长度和数量对性能的影响。

        图5:射线数量对性能的影响(图片见原网页)

        图6:射线长度对性能的影响(图片见原网页)

        另外为了演示目的,我决定让它从简单碰撞器切换到网格碰撞器。

        图7:网格碰撞器场景(每个碰撞器110个顶点)(图片见原网页)

        图8:简单与网格碰撞体物理分析器数据(图片见原网页)

        正如你从剖面图中看到的那样,对网格碰撞器进行射线投射使得物理引擎每帧的工作量更大。


物理2D与3D

        选择什么物理引擎最适合您的项目,如果您正在开发2D游戏或2.5D(2D平面上的3D游戏),那么使用3D物理引擎是一种矫枉过正的行为,这个多余的维度会使您的项目发生不必要的CPU消耗。您可以查看我之前专门针对该主题撰写的文章中两种引擎之间的性能差异:http://x-team.com/2013/11/unity3d-v4-3-2d-vs-3d-physics/

刚体

        在添加对象之间的物理交互时,Rigidbody组件是一个重要组件。即使使用碰撞器作为触发器,我们也需要将其添加到游戏对象中以使OnTrigger事件正常工作。没有RigidBody组件的游戏对象被认为是静态碰撞体。这一点很重要,因为尝试移动静态碰撞器效率极低,这会强制物理引擎再次强制计算整个物理世界。幸运的是,分析器将让你知道当你移动一个静态碰撞体的时候,会向CPU分析器的警报栏添加警告。为了更好地展示移动静态碰撞体时的影响,我移除了第一个demo中所有物体上的刚体,然后采集了分析器上新的数据。

        图9:移动静态碰撞体警告(图见原网页)

        从图中可以看到,总共产生了2000个警告,每个移动的游戏对象都有一个警告。同样,在物理上花费的CPU的平均时间从〜17.6ms增加到〜35.85ms,这是相当多的。移动游戏对象时,必须将RigidBody添加到游戏对象上。如果要直接控制其运动,只需给其勾选为刚体属性的运动学即可。


固定时间步

        调整Time Manager上的Fixed Timestep值,这会直接影响FixedUpdate()和Physics更新速率。通过改变这个值,你可以尝试在精确度和CPU在物理上花费的时间之间达成很好的折衷。


总结

        上述所有讨论的主题都很容易配置/实现,它们肯定会对您的项目性能产生影响,因为几乎所有您开发的游戏都将使用物理引擎,即使它仅用于碰撞检测。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容