c – 在游戏控制台上加载最佳数据文件格式
作者:互联网
我需要尽可能高效地在较旧的基于CD的游戏机上加载大型模型和其他结构化二进制数据.最好的方法是什么?数据将从Python应用程序导出.这是一个非常精心设计的爱好项目.
Requierements:
>不依赖于完全符合标准的STL – 我可能会使用uSTL.
>尽可能少的开销.瞄准一个如此好的解决方案.它可以在原始Playstation上使用,但尽可能现代和优雅.
>不需要向后/向前兼容性.
>不要复制大块 – 最好是文件在后台加载到RAM中,然后直接从那里访问所有大块.
>不应该依赖具有相同字节顺序和对齐的目标,即Python中的C插件将其结构转储到光盘上不是一个好主意.
>应该允许移动加载的数据,就像单个文件的RAM大小的1/3一样,碎片可能是个问题.没有MMU滥用.
>健壮性是一个很大的好处,因为我的注意力很短,即我会改变保存部分代码并忘记加载一个或反之亦然,所以至少一个愚蠢的保护措施会很好.
>加载数据和运行时生成的数据之间的可交换性没有运行时开销,也没有严重的内存管理问题,这将是一个很好的奖励
我有一个半平面的解析Python琐碎,有限的语法C头,它将使用带偏移而不是指针的结构,以及主应用中的便利包装器结构/类,带有getter,可将偏移转换为正确类型的指针/参考,但我想听听你的建议.
澄清:请求主要是关于数据加载框架和内存管理问题.
解决方法:
这是一种常见的游戏开发模式.
通常的方法是在离线预处理步骤中烹饪数据.生成的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;
}
我的bbq库还没有为黄金时间做好准备,但是它可以给你一些关于如何在python中自己编写一个的想法.
祝好运!
标签:python,c-2,embedded,playstation 来源: https://codeday.me/bug/20190722/1498786.html