内容很多摘自
Aman JIANG(江超宇)翻译的Box2D v2.0.1 用户手册
第03章 公共模块(Common)
3.1 关于
公共模块包含了配置(Settings),内存管理(memory management)和矢量数学(vector math)
3.2 配置
头文件 b2Settings.h 包含:
• 类型, 比如int32和float32
• 常数
• 分配器包装(Allocation wrappers)
• 版本号
• 摩擦混合及恢复混合的函数
类型
Box2D定义了不同的类型, 比如float32, int8等, 方便确定结构的大小。
常数
Box2D定义了一些常数, 都记录在b2Settings.h中。通常你不需要调整这些常数。
Box2D的碰撞计算和物体模拟使用了浮点数学。考虑到有舍入方面的错误,所以要定义一些数值公差的,一些是绝对公差,另一些是相对公差。绝对公差使用MKS单位。
分配器包装
配置文件定义了b2Alloc和b2Free, 用于大内存的分配。你可以让b2Alloc和b2Free再调用自己的内存管理系统(memory management system)。
版本
b2Version结构保存了当前的版本信息,你可以在运行时(run-time)查询.
摩擦混合及恢复混合
假如你的应用程序需要定制这些混合函数, 可以在配置文件中找到它们。
3.3 内存管理
Box2D 的许多设计都是为了能快速有效地使用内存。在本节我将论述 Box2D 如何及为什么要这样分配内存。
Box2D 倾向于分配大量的小型对象(50-300 字节左右)。这样通过 malloc 或 new 在系统的堆(heap)上 分配内存就太低效了,并且容易产生内存碎片。多数这些小型对象的生命期都很短暂,例如触点 (contact),可能只会维持几个时间步。所以我们需要为这些对象提供一个有效的堆分配器(heap allocator)。
Box2D的解决方案是使用小型对象分配器(SOA), 命名为b2BlockAllocator。SOA维护了一些不定尺寸并可扩展的内存池。当有内存分配请求时,SOA 会返回一块大小最匹配的内存。当内存块释放之后, 它会被回收到池中。这些操作都十分快速,只有很小的堆流量。
因为 Box2D 使用了SOA, 所以你永远也不应该去 new 或 malloc 一个body, fixture或joint。你只需分配一个 b2World,它为你提供了创建body, fixture和joint的工厂(factory)。这使得Box2D可以使用 SOA 并且将赤裸的细节隐藏起来。同样绝对不要去 delete 或 free 一个body, fixture或joint。
当执行一个时间步的时候,Box2D 会需要一些临时的内存。为此,它使用了一个栈分配器来消除单步堆分配, 这分配器命名为b2StackAllocator。你不需要关心栈分配器,但对此有所了解还是不错的。
3.4 数学
Box2D包含了一个简单,精细的矢量和矩阵模块,来满足Box2D内部和API接口的需要。所有的类都是公开的, 你可以在自己的应用程序中自由使用它们。
数学库保持得尽量简单, 使得Box2D容易移植和维护。