这是一种常见的游戏开发模式。
通常的方法是在离线预处理步骤中处理数据。生成的 blob 可以以最小的开销流入。blob 依赖于平台,并且应该包含目标平台的正确对齐和字节序。
在运行时,您可以简单地将指针转换为内存中的 blob 文件。您也可以处理嵌套结构。如果您保留一个目录,其中包含对 blob 中所有指针值的偏移量,那么您可以修复指针以指向正确的地址。这类似于 dll 加载的工作方式。
我一直在开发一个 ruby 库bbq,我用它来为我的 iphone 游戏制作数据。
这是我用于 blob 标头的内存布局:
// Memory layout
//
// p begining of file in memory.
// p + 0 : num_pointers
// p + 4 : offset 0
// p + 8 : offset 1
// ...
// p + ((num_pointers - 1) * 4) : offset n-1
// p + (num_pointers * 4) : num_pointers // again so we can figure out
// what memory to free.
// p + ((num_pointers + 1) * 4) : start of cooked data
//
这是我加载二进制 blob 文件并修复指针的方法:
void* bbq_load(const char* filename)
{
unsigned char* p;
int size = LoadFileToMemory(filename, &p);
if(size <= 0)
return 0;
// get the start of the pointer table
unsigned int* ptr_table = (unsigned int*)p;
unsigned int num_ptrs = *ptr_table;
ptr_table++;
// get the start of the actual data
// the 2 is to skip past both num_pointer values
unsigned char* base = p + ((num_ptrs + 2) * sizeof(unsigned int));
// fix up the pointers
while ((ptr_table + 1) < (unsigned int*)base)
{
unsigned int* ptr = (unsigned int*)(base + *ptr_table);
*ptr = (unsigned int)((unsigned char*)ptr + *ptr);
ptr_table++;
}
return base;
}
My bbq library isn't quite ready for prime time, but it could give you some ideas on how to write one yourself in python.
Good Luck!