游戏开发实践小问题:影子战术NPC与多重重叠的碰撞
来源:www.dyid168.com
作者:敢想数字
时间:2017-07-28
我们的游戏玩家用户非常聪明,一般避免了大而显而易见的事情。看到一个做出一系列理性决策的游戏开发项目是更常见的,每个游戏开发项目都会减少PhysX更新的次数。当你在大规模的游戏中工作时,很容易发生这种情况。您游戏开发的AI测试级别在空盒中有5个AI。当你将同样的AI放在你的实际水平,突然你的帧率坦克,物理学。更新的尖峰,你不知道为什么。数百或数千个碰撞的GameObject中的哪一个是罪魁祸首?
你做了比你需要的更多的测试吗?可以使用图层来控制哪些GameObjects使用ProjectSettings-> Physics中的复选框的网格来相互碰撞。在针对游戏开发特定的碰撞几何形状进行任何昂贵的测试之前,将进行评估使用它来积极地剔除不需要发生的任何冲突。许多游戏开发将使用大的Colliders与'Is Trigger'设置为true来检测字符或其他特定的游戏对象,通常被称为触发器卷。这些触发器卷经常被设置为与默认层或所有内容相冲突。通过在特定图层中包含字符,并且这些触发器在层中只会与您的字符层相冲突,您可以避免测试大量的对齐标签来抵抗复杂的世界网格碰撞或地形碰撞。
触发器是否会减缓所有事情?一个触发器体积,一个具有'Is Trigger'设置为true的碰撞器,仍然是必须在一天结束时进行测试的碰撞几何。如果您正在移动触发器体积与移动任何其他碰撞几何一样昂贵,并且可能导致大量工作发送冲突和重叠事件。如果您要触发碰撞移动每一帧,请确保您只与所需的对象相撞。尝试保持触发尽可能小,并分组类似或重叠的触发器。
游戏开发实践小问题:影子战术NPC与多重重叠的碰撞
我看到的一个常见游戏开发模式是让NPC使用多个大的触发器卷来检测交互式目标。 NPC正在寻找的每种类型的游戏对象都会在OnCollision回调中拥有自己的对撞机一堆代码,以确保它已经找到了它正在寻找的东西。将多个触发器卷合并为一个触发器通常更快,然后根据OnCollision回调中的Tag或Layer或距离进行过滤。在许多情况下,您可以通过绕过碰撞来获得更好的性能。不要在每一帧对齐碰撞的世界中检查一个球体,请使用共享管理器注册任何您想要查找的对象,然后让NPC对所有注册的对象进行简单的距离检查。如果您有一小部分潜在目标,这将比对世界各地的所有碰撞进行测试更有效率。
也许层次结构导致PhysX比所需要的工作要多得多?在Recore,我们发现了几个地方游戏开发建立了平台的旋转环,每个方形的环都有自己的刚体。这导致每个段测试与所有其他段的冲突。通过将共享父级中的所有平台与Rigidbody进行分组,并转动该父代,我们可以在Physics.Update内保存显着的帧时间。请注意,在共享Rigidbody下组合Colliders会增加对其进行任何Raycast或形状投射测试的成本。
从另一个方向来看,如果您已经有一个共享Rigidbody父项下的几个对照框,则需要非常小心,不要相对于父项移动它们。任何时候刚体变形,必须重新计算质心和惯性张量。这需要大量的帧时间。最常见的是,当一个刚体被附加到一个动画角色的肢体。您可以通过设置自己的质心来关闭此功能。只要GameObject的形状没有太大变化,这不应该是明显的。
这些小而系统的游戏开发问题加起来很快,所以当你制定和提前计划以避免这些问题时,请牢记它们。如果您突然看到物理学时间的巨大飙升,请查看大量性能问题的常见原因,并查看是否有任何应用。