Это обычный шаблон разработки игр.
Обычный подход - готовить данные в автономном режиме предварительной обработки. Получающиеся капли могут быть переданы с минимальными накладными расходами. Капли зависят от платформы и должны содержать правильное выравнивание и порядковый номер целевой платформы.
Во время выполнения вы можете просто привести указатель на файл BLOB-объекта в памяти. Вы также можете иметь дело с вложенными структурами. Если вы сохраняете оглавление со смещением для всех значений указателя в BLOB-объекте, вы можете исправить указатели, чтобы они указывали на правильный адрес. Это похоже на работу загрузки DLL.
Я работал над библиотекой ruby, барбекю , которую я использую для приготовления данных для моей игры на 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.
Удачи!