以下为个人学习笔记整理。参考 PhysX SDK 3.4.0 文档,部分代码可能来源于更高版本。
# PhysX 内置容器介绍(未完待续)
本文主要归纳了 PhysX 里看到的一些内置容器,因为用的时候每次都要确认一下,干脆做个系统记录。
# 基础容器
# Array
常规数组,支持扩容。插入时如果容量不够了触发扩容,每次扩容容量翻倍。
# InlineArray
支持提前分配好 N 个元素的 Array。
# Pool
Pool 其实是一个维护多个指针的数组,其继承自 PoolBase:
- mSlabs:InlineArray 的数组指针,初始时大小为 64。
- mElementsPerSlab:代表每次分配新数组时的数组元素个数。
- mSlabSize:代表每次新分配数组时的数组大小。
- mUsed:记录整个 Pool 中所有被使用的元素个数。
- mFreeElement:记录了所有空闲节点的单链表。
这里有一点比较有意思,构建空链表的时候用了 reinterpret_cast,会把当前节点原本的类型视为 FreeList 来使用,因此数组中每个元素至少都得有一个指针大小,否则就会有问题。
# HashMap
PhysX 内置的 HashMap,用的是类似 hash 桶的实现。
- mFreeList:指向空闲链头
- mHash:hash 桶,存放第一个节点的下标
- mEntries:对象数组,存放所有对象数据
- mEntriesNext:存放对应下标的 mEntries 节点的下一个节点下标
默认 Hash 桶数量为 64,装载因子 0.75。超过后触发扩容机制,2 倍扩容。
例如下图:4,16,8 都在第一个 hash 桶里,通过 mEntriesNext 把他们给串起来,同理 mFreeList 也通过 mEntriesNext 把空闲节点串起来。