2D 物理引擎调研及游戏中的应用

Box2D VS Chipmunk2D

这里说的都是 Golang 版本

Box2D : https://github.com/ByteArena/box2d

Chipmunk2D : https://github.com/jakecoffman/cp

功能对比:

功能 Box2D Chipmunk2D
场景构建 Y Y
绑定 userdata Y Y
墙体 Y Y
包围盒查询 Y Y
射线检测 Y Y
查询算法 A dynamic AABB tree a bounding box tree
是否并发查询 Y BBQuery 内部加了 Lock,在提 issue 确认是否可优化
星数 276 234
最后维护时间 4 years ago 2 weeks ago
最后版本 v1.0.2 v2.0.1

关注的功能, 2 个库都有。而 Chipmunk2D 的 Golang 版本,目前还积极维护,因此选择 Chipmunk2D

  • Chipmunk2D BBQuery 有全局锁问题,如果没解决,会用 Box2D

绑定 userdata

这样这个场景才能和外部系统深度融合

墙体

墙体属于不占地面面积,又具备碰撞的功能。适合很多游戏中的碰撞玩法需求

包围盒查询

一些玩法如:

  • 查询某区域是否被占用
  • 查询就区域技能释放对象

都可以通过包围盒查询来实现

射线检测

一些玩法如:

  • 是否可以移动
  • 射击
  • 击中

都可以通过射线检测来实现

场景构建

实际分为静态场景和动态场景

分开主要基于内存考虑:

  • 静态场景,服务进程仅持有一份
    • 不需要多次创建时的 CPU 消耗
    • 不需要玩家级别数内存占用
    • 并发安全。因为没有运动中的刚体。协程安全
  • 动态场景,玩家特有场景内容

因此包围盒查询射线检测等,实际会做分别静态场景、动态场景各做一次:

外部系统融合

与场景相关的范围搜索、碰撞检测,理论上自己写也优化不出经典的 2D 物理引擎实作了

它们都是基于 AABB 包围盒的空间搜索优化算法

因此外部系统只要用 userdata 与它们相互绑定,只需要维护 userdata 列表即可

相关玩法调用 2D 物理引擎的接口即可,无论是:

  • 物件摆放
  • 技能伤害计算
  • AOI 内部查询
  • 空间范围查询
  • 碰撞检测

等等

路线规划

Box2D Chipmunk2D 均不具备寻路功能,因为内部使用 AABB tree 组织数据的,便于高效查询

如果是后端需要经常寻路的玩法(通常非常少),那么需要重新选择引擎了,比如可以选用 recastnavigation

你可能感兴趣的:(服务器3D场景建模,游戏,2d,物理引擎,碰撞检测,包围盒查询,场景建模)