以下为个人学习笔记整理。参考 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 来使用,因此数组中每个元素至少都得有一个指针大小,否则就会有问题。

image-20220823163318660

# HashMap

PhysX 内置的 HashMap,用的是类似 hash 桶的实现。

  • mFreeList:指向空闲链头
  • mHash:hash 桶,存放第一个节点的下标
  • mEntries:对象数组,存放所有对象数据
  • mEntriesNext:存放对应下标的 mEntries 节点的下一个节点下标

默认 Hash 桶数量为 64,装载因子 0.75。超过后触发扩容机制,2 倍扩容。

例如下图:4,16,8 都在第一个 hash 桶里,通过 mEntriesNext 把他们给串起来,同理 mFreeList 也通过 mEntriesNext 把空闲节点串起来。

image-20220720204742985

# 特殊容器

更新于 阅读次数

请我[恰饭]~( ̄▽ ̄)~*

鑫酱(●'◡'●) 微信支付

微信支付

鑫酱(●'◡'●) 支付宝

支付宝