Box2D v2.1.0用户手册翻译 - 第03章 公共模块(Common)

转自Complex_Ok

第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容易移植和维护。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值