跳至正文

(转载)BOX2D V2.3.0 用户手册中文版(第3章)-通用模块

Chapter 3 通用模块

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调用你自己的内存管理系统。

版本号

b2Version结构保存了当前的版本信息,你可以在运行时(run-time)查询。

3.3 内存管理

Box2D 设计上的很多决定,都是为了能快速有效地使用内存。在本节我将论述 Box2D 如何及为什么要这样分配内存。
Box2D 倾向于分配大量的小型对象(50-300 字节左右)。在系统的堆(heap)上,通过 malloc 或 new分配内存既低效,又容易产生内存碎片。大多数小型对象的生命期都很短暂,例如触点 (contact),可能只会维持几个时间步。所以我们需要为这些对象提供一个有效的堆分配器。
Box2D的解决方案是使用名为b2BlockAllocator的小型对象分配器(SOA)。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容易移植和维护。

标签:

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注