当初始化 SDK 时,可以指定一个用户定义的内存管理类。这个机制对于 PC 开发来说,效果不是很明显,它适合用在有特殊内存需求的系统中。其次允许监控 SDK 的内存使用,这点在很多时候非常重要。
为了让 SDK 使用你自己的内存分配函数来代替标准 C 的 malloc/realloc/free,你需要从 NxUserAllocator派生一个类,实现所有的纯虚函数。 这些函数主要是 C 运行时的 malloc/realloc/free,所以当你第一次尝试的时候可以调用这些函数。下面是一个实现示例。SDK 不保证一些真实专用分配器的特殊用法。很多情况下,SDK 会在启动的时候使用你的分配器分配一大块内存,然后在这中间来处理内部的内存分配请求。
你定义的分配器会在启动的时候作为第二个可选参数传递给 NxCreatePhysicsSDK() 函数。当你创建了 SDK,没有办法更改或者移除分配器。
注意:分配器内部不应调用 SDK 的函数。
class MyAllocator : public NxUserAllocator
{
public:
void * malloc(NxU32 size)
{
return ::malloc(size);
}
void * mallocDEBUG(NxU32 size,const char *fileName, int line)
{
return ::_malloc_dbg(size,_NORMAL_BLOCK, fileName, line);
}
void * realloc(void * memory, NxU32 size)
{
return ::realloc(memory,size);
}
void free(void * memory)
{
::free(memory);
}
} myAllocator;
gPhysicsSDK = NxCreatePhysicsSDK(NX_PHYSICS_SDK_VERSION, &myAllocator, 0);
线程
当它被用户线程或者物理处理线程的上下文设备中调用的时候,用户要确保分配器的线程安全。一般,系统提供的/ C 库的内存分配例程都是线程安全的,除非用户链接了一个特殊的单线程 C 运行库(这时需要线程同步)。
API 参考
NxUserAllocator