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容易移植和維護。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章