角色运动阻挡计算的优化

梦想游戏人
目录:
algorithm, 游戏开发

这里体现的基本思想是用内存去换CPU。

物理Raycast应用场景很多,比如碰撞检测,角色运动合法性检测。这里来用角色的运动来举例分析,优化思路和方法。

2D角色运动较为简单,可以用像素格子的思路来判定运动和阻挡判断。较为复杂的精确的方法是用数学运算去进行处理。空间重叠,简单方法就是用物理引擎提供的场景查询方法去处理目标位置是否可以移动。

3D角色中一般是用物理引擎去处理移动,可以是牛顿力学+物理场景查询,牛顿力学用来计算目标位移点,场景查询用来判断可达。3D移动场景中,可以用射线检测来让角色Y坐标和地面贴合。在实践过程中,Raycast占比会很大。这里针对这个的应用场景提出2个优化方案。

方案1:通过寻路算法来确定目标可达和路径来进行对比。如果可达那么就可以进行距离判定了,距离在一定容错范围内那就等同于Raycast的做法了。

方案2:通过格栅化的静态查询数据来达到O(1)级别。这个思路和高度图很像,在除了物理场景信息,还可以预先bake出raycast的静态数据图,在runtime的时候通过坐标信息查询就可以知道该点是否可达。这种方法在服务端较为合适,因为内存足够大。

在这里还可以利用多种思路结合起来组成一套解决方案,比如结合AOI,遮挡剔除的思想来进行减少物理相关的运算。

比如场景中,除了静态阻挡,还有部分是runtime时产生的一些阻挡,那么可以通过剔除思想来判定当前角色范围内是否需要进行物理查询来补足静态场景不适用的情况,从而达到优化性能的目的。

Scroll Up