Есть много способов сделать это. У m_pGladiator есть несколько хороших идей, особенно с разделением. Я хотел бы сделать несколько других комментариев.
Во-первых, если вы собираетесь упаковать кучу ресурсов в один файл (я называю эти пакетные файлы), то я думаю, что вам следует поработать, чтобы избежать загрузки всего файла и последующей десерализации из этого файла в память. Простая причина в том, что это больше памяти. Я полагаю, что это не проблема для ПК, но это хорошая практика, и это важно при работе на консоли. Хотя мы (в настоящее время) не сериализуем объекты, как предложил m_pGladiator, мы движемся к этому.
Существует два типа упаковочных файлов, которые могут у вас быть. Одним из них будет файл, в котором вы хотите произвольный доступ к содержимому файлов. Второй тип может представлять собой набор файлов, в которых вам нужно все этих файлов при загрузке уровня. Базовый пример может быть:
- Аудио-файл может содержать все аудио для вашей игры. Вам может потребоваться загрузить только определенные виды аудио для меню или экранов интерфейса и разные наборы аудио для уровней. Это может попасть в первую категорию выше.
- Типом, который попадает во вторую категорию, могут быть все модели / текстуры / и т. Д. Для уровня. В основном вы хотите загрузить все содержимое этого файла в игру во время загрузки, потому что вам (вероятно) понадобится все его содержимое, пока игрок играет на этом уровне или в разделе.
многие из упакованных нами файлов попадают во вторую категорию. Мы в основном упаковываем содержимое уровня, а затем сжимаем их чем-то вроде zlib. Когда мы загружаем один из них во время игры, мы читаем небольшой объем файла, распаковываем то, что прочитали, в буфер памяти, а затем повторяем, пока весь файл не будет считан в память. Буфер, в который мы читаем, является относительно небольшим, в то время как буфер конечного назначения достаточно велик, чтобы вместить самый большой набор несжатых данных, которые нам нужны. Этот метод сложен, но, опять же, он экономит ОЗУ, это интересное упражнение, чтобы начать работать, и вы чувствуете себя хорошо и тепло внутри, потому что вы хорошо управляете системными ресурсами. как только пакетный файл полностью распакован в его буфер назначения, мы запускаем последний проход в буфере, чтобы исправить расположение указателей и т. д. Этот метод работает, только когда вы записываете свой пакетный файл как структуры, известные игре. Другими словами, наши инструменты для написания файлов Packfile разделяют структуру (или классы) с кодом игры. Мы в основном пишем и сжимаем точные представления структур данных.
Если вы просто хотите сократить количество файлов, которые вы отправляете и устанавливаете на компьютере пользователя, вы можете сделать что-то вроде первого типа упаковочного файла, который я описал. Может быть, у вас есть тысячи текстур, и вы просто хотели бы сократить количество файлов, которые нужно сжать и упаковать. Вы можете написать небольшую утилиту, которая в основном будет читать файлы, которые вы хотите упаковать вместе, а затем записывать заголовок, содержащий файлы и их смещения, в файл пакета, а затем вы можете записать содержимое файла, по одному за раз, один за другим в вашем большом двоичном файле. Во время игры вы можете просто загрузить заголовок этого пакета и сохранить имена файлов и смещения в хэше. Когда вам нужно прочитать файл, вы можете хэшировать имя файла и посмотреть, существует ли он в вашем файле пакета, и если это так, вы можете прочитать содержимое непосредственно из файла пакета, выполнив поиск по смещению, а затем прочитав это место в файле пакета. Опять же, этот метод представляет собой способ упаковки данных без учета шифрования и т. Д. Это просто организационный метод.
Но опять же, я хочу подчеркнуть, что если вы идете по маршруту, подобному I или m_pGladiator, я бы усердно работал, чтобы не загружать весь файл в ОЗУ, а затем десериализовать в другое место в ОЗУ. Это пустая трата ресурсов (которых у вас, возможно, много). Я бы сказал, что вы можете сделать это, чтобы он заработал, а затем, как только он заработает, вы можете работать с методом, который одновременно читает только часть файла, а затем распаковывает его в целевой буфер. Вы должны использовать схему comprsesion, которая будет работать так же. zlib и lzw оба делают (я верю). Я не уверен насчет алгоритма MD5.
Надеюсь, что это поможет.