第三章 公共模块
来源:互联网 发布:手机知乎怎么关注问题 编辑:程序博客网 时间:2024/05/17 01:19
声明:此文章翻译自Box2D v2.2.0用户手册,仅供学习参考。
3.1 关于
公共模块包括了设置,内存管理以及矢量数学。
3.2 设置
b2Settings.h头文件包括如下:
- 诸如int32和float32的类型
- 常量
- 分配器包装(Allocation wrappers)
- 版本号
类型
Box2D定义了大量诸如float32,int8类型等等。可以方便的确定结构的大小。
常量
Box2D定义了一些常量。这些都被记录在b2Settings.h文件中。正常情况下不需要调整这些常量。
Box2D使用浮点数来进行模式和碰撞计算。由于舍入方面误差的原因需要定义一些公差。其中一些公差是绝对的,一些公差是相对的。绝对的公差使用MKS(Meters-Kilometers-Seconds)单位。
分配器包装(Allocation wrappers)
设置文件中定义了b2Alloc和b2Free两个方法,用于大的内存分配。你可以使用这两个方法来调用你的内存管理系统。
版本号
在程序运行的时候你可以通过查询b2Version这个结构体来获取当前的版本号。
3.3 内存管理
Box2D的大量设计都是为了能够快速和有效的使用内存。在本节,我将讨论怎样以及为什么要Box2D来分配内存。
Box2D更倾向于分配大量的小对象(约50~300字节)。若使用malloc或者new在内存堆上分配将是低效的,并且会产生内存碎片。大量小对象或许会有很短的生命周期,例如接触(contacts),不过可以持续几个时间步长。所以我们需要一个分配器来有效的为这些对象提供堆内存。
Box2D的解决方案是使用一个叫做b2BlockAllocator的小对象分配器(small object allocator,SOA)。小对象分配器持有一个可任意增长大小不定的内存池。当需要内存的时候,SOA根据需求返回一块大小合适的内存空间。当内存块释放之后,再返还给内存池。这两个操作很快,只会引起很小的堆流量。
既然Box2D使用SOA,那么你就永远不要使用new和malloc创建物体,定制器(fixture)或者连接器。无论如何,你仍然需要创建一个属于你自己的b2World对象。b2World类提供了创建物体,定制器(fixture)以及连接器的工厂方法。那么这样Box2D就可以使用SOA并且可以为你隐藏血腥(译者注:这里指对内存的分配和回收,也显示了作者很幽默)的细节。永远不要调用delete或者是free来释放物体,定制器(fixture)或者连接器。
当运行一个步长的时候,Box2D需要临时内存空间。为了完成这个任务,Box2D会调用一个叫做b2StackAllocator的栈分配器来防止单步堆分配。你不需要关心栈分配器,但是了解一下还是不错的。
3.4 数学
Box2D包含了一个简单的小巧的向量和矩阵模块。这部分设计用来满足Box2D内部使用和API接口的需要。这部分所有成员都是公开的,所以你可以在你的应用程序中自由的使用。
数学库尽量保持着简单,保持着Box2D的可移植性和可维护性。
- 第三章 公共模块
- BOX2D 第三章 公共模块
- 第三章 最长公共子序列
- 第03章 公共模块(Common)
- 第三章:OSGi模块层
- HOOK API公共模块
- 模块—公共物品
- 留言板之公共模块
- 开发页面公共模块
- idea安装公共模块
- 第三十九章:最近公共祖先LCA问题
- 第三章——构建模块
- 公共模块禁止直接访问
- 访问路径及公共模块
- 第三方模块
- Python第三方模块
- 安装第三方模块
- python 第三方模块
- cocoapods安裝及使用
- 计算机程序的构造和解释 练习 1.10
- 数据库使用遇到的问题
- [mysql]数据库复习
- andoird添加log4j日志
- 第三章 公共模块
- Java新手学习路线java教程
- 《C++精英内参之程序员高效指南》-12-7影响效率的不良习惯之疲劳
- c++实验6-数组合并
- PPT2013放映时如何让鼠标指针隐藏
- CUDA文档方面
- Python3 迭代器与生成器
- js css 加载
- HDU3760 Ideal Path 逆bfs+贪心