这里说的都是 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
这样这个场景才能和外部系统深度融合
墙体属于不占地面面积,又具备碰撞的功能。适合很多游戏中的碰撞玩法需求
一些玩法如:
都可以通过包围盒查询来实现
一些玩法如:
都可以通过射线检测来实现
实际分为静态场景和动态场景
分开主要基于内存考虑:
因此包围盒查询
、射线检测
等,实际会做分别静态场景、动态场景各做一次:
与场景相关的范围搜索、碰撞检测,理论上自己写也优化不出经典的 2D 物理引擎实作了
它们都是基于 AABB 包围盒的空间搜索优化算法
因此外部系统只要用 userdata 与它们相互绑定,只需要维护 userdata 列表即可
相关玩法调用 2D 物理引擎的接口即可,无论是:
等等
Box2D Chipmunk2D 均不具备寻路功能,因为内部使用 AABB tree 组织数据的,便于高效查询
如果是后端需要经常寻路的玩法(通常非常少),那么需要重新选择引擎了,比如可以选用 recastnavigation