Ваш дизайн мне нравится, хотя я предполагаю, что вы имели в виду 32 бит для размера, а не 32 байт !
Я думаю, что ваш дизайн лучше всего подходит для ситуаций, когда вы хотите загрузить все свои активы за один раз, потому что это своего рода последовательный дизайн. Если вы хотите загружать только несколько ресурсов за раз (возможно, потому что каждый игровой уровень использует только подмножество активов), то это будет несколько менее эффективно, потому что вам придется по очереди просматривать каждый актив, чтобы найти их. что ты хочешь.
В этом случае вы можете попробовать более индексированный дизайн, возможно, что-то вроде этого:
[HEADER]
[Miscellaneous header stuff]
[Offset to index from start of file]
[Number of entries in index]
[RECORD 1]
[Asset data]
[RECORD 2]
[Asset data]
.
.
[RECORD N]
[Asset data]
[INDEX]
[ID or filename of asset 1]
[Size of asset 1]
[Offset to asset 1 from start of file]
[Other asset 1 flags or whatever]
[ID or filename of asset 2]
[Size of asset 2]
[Offset to asset 2 from start of file]
[Other asset 2 flags or whatever]
.
.
Это позволило бы улучшить произвольный доступ к активам, потому что теперь вам просто нужно искать по своему индексу (который вы бы загрузили в память), а не по всему файлу (который может не помещаться в память). Если вы хотите получить фантазию, вы можете использовать дерево или хеш-таблицу для индекса.
Причина размещения индекса в конце файла, а не в начале, заключается в том, что это упрощает добавление другого актива в файл пакета без необходимости перестраивать весь объект. В противном случае дополнительная запись в вашем индексе отбросит все ваши смещения.
РЕДАКТИРОВАТЬ: чтобы ответить на комментарии ...
Я имел в виду, что вы будете получать доступ к активам только через индекс, так что, надеюсь, вы никогда не выйдете за пределы активов при их чтении. Возможно, поможет пример типичного варианта использования.
Допустим, вы хотите прочитать текстуру под названием "TankTexture.png". Вот как я думаю, что вы пошли бы по этому поводу:
- Откройте файл пакета.
- Читайте в заголовке фиксированного размера.
- Извлечение смещения индекса и количества записей из заголовка.
- Искать начало индекса.
- Считать индекс в массив (фиксированный размер записи индекса, умноженный на количество записей).
- Поиск по индексу для актива под названием "TankTexture.png".
- Извлечение смещения и размера актива из записи индекса.
- Искать начало актива.
- Считайте количество байтов, указанное размером актива.
Конечно, для последующих активов вам понадобятся только шаги 6-9.
Надеюсь, это поможет объяснить, о чем я думал. Дайте мне знать, если у вас есть другие вопросы.