Как запаковать игру в один файл

Обновлено: 07.07.2024

Однако существуют программы, использующие сторонние библиотеки, но при этом состоящие из одного единственного файла. Все утилиты от SysInternals, а также любимый мной LINQPad представляют из себя один файл в котором содержится все, что требуется для работы. Пользоваться такими утилитами одно удовольствие — они сразу готовы к использованию, их удобно передавать и хранить.

В статье рассказывается, как создавать такие автономные программы из одного файла. Разобран пример как со сжатием зашить библиотеку AutoMapper в программу и как ее потом достать и использовать.

Исходный код к статье — скачать

Код программы использует стороннюю библиотеку AutoMapper. Чтобы убедиться в работоспособности библиотеки после ее зашития в ресурсы, в программе вызывается код из семплов к библиотеке. Этот код здесь не приведен, ибо это статья не об AutoMapper. Но сама библиотека интересная и полезная — рекомендую посмотреть, что же она делает в коде.

Если CLR не удалось найти сборку, вызывается событие AppDomain.AssemblyResolve. Событие дает возможность загрузить требуемую сборку вручную. Поэтому для реализации автономной программы, состоящей из одного exe файла, достаточно зашить все зависимые сборки в ресурсы и в обработчике AssemblyResolve подгружать их.

Удобно класть в ресурсы сборки в архивированном виде. Архивация уменьшает размер итоговой программы приблизительно в 2 раза. Скорость запуска увеличивается, но эти доли секунды мало кто заметит. А вот уменьшение размера файла позволит его быстрее качать по сети.

Итак, у нас есть работающий проект, использующий сторонние библиотеки. Хочется, чтобы exe файл проекта был автономен и не требовал наличия зависимых dll в своем каталоге.

Полученную ранее архивированную сборку добавляем в ресурсы проекта через Project Properties-Resources-Files. Студия при добавлении ресурса генерирует код, который позволяет использовать добавленный ресурс через Resources класс.

Регистрируем обработчик AssemblyResolve (до использования классов зависимой библиотеки):

AppDomain .CurrentDomain.AssemblyResolve += AppDomain_AssemblyResolve;
Код обработчика:
private static Assembly AppDomain_AssemblyResolve( object sender, ResolveEventArgs args )
if ( args.Name.Contains( "AutoMapper" ) )
Console .WriteLine( "Resolving assembly: " , args.Name );

// Загрузка запакованной сборки из ресурсов, ее распаковка и подстановка
using ( var resource = new MemoryStream ( Resources .AutoMapper_dll ) )
using ( var deflated = new DeflateStream ( resource, CompressionMode .Decompress ) )
using ( var reader = new BinaryReader ( deflated ) )
var one_megabyte = 1024 * 1024;
var buffer = reader.ReadBytes( one_megabyte );
return Assembly .Load( buffer );
>
>

Для нескольких зависимых библиотек стоит ввести соглашение, согласно которому имя ресурса и искомой сборки совпадают. Тогда можно с помощью отражения автоматически искать требуемую библиотеку в ресурсах.

По умолчанию зависимые библиотеки, добавляемые через References, копируются в выходную директорию проекта. Чтобы AssemblyResolve сработал, нужно либо скопировать выходной exe файл в другую директорию, либо запретить копировать зависимые библиотеки в конечную директорию через References-AutoMapper-Properties-Copy Local=false.

Включение зависимых сборок в ресурсы самой программы позволяет ей работать автономно. Для запуска требуется один лишь exe файл. Это важно для служебных утилит, сразу готовых к использованию.

Фактически такие автономные программы не требуют установки и их удобно передавать по сети или хранить на флешке. Архивирование сборок позволяет уменьшить размер программы и больше таких программ разместить на флешке / быстрее выкачивать из сети.

Обычно я прошу сбросить заказ, состоящий из нескольких аудиозаписей одним файлом, то есть, упаковать их в один архив.

Для пользователей, которые еще не знакомы с понятиями архива, архиватора, форматами ZIP и RAR, я постараюсь в этой статье кратко объяснить эти понятия и пошагово научу использовать данные средства для упаковки файлов.

Итак, архив – это файл, включающий в себя несколько других файлов, чаще всего используется для сжатия информации. А архиватор – это программа, предназначенная для сжатия и упаковки файлов в архив. Такая операция позволяет уменьшить размер исходных файлов, что очень удобно как для их долгосрочного хранения на компьютере, так и для отправки/пересылки файлов через интернет. В один архив можно упаковать десятки и даже сотни файлов и папок.

Форматы ZIP и RAR – самые распространенные форматы сжатия данных. И хотя по объему сжатия ZIP проигрывает RAR формату, но исторически чаще используется для архивирования и обмена данными.

Самый простой способ создать архив – это использование стандартных возможностей Windows без установки на компьютер стороннего программного обеспечения. Для этого вам нужно проделать следующие действия:

В этой же папке появится ZIP-архив, где будут содержаться все выделенные вами файлы, только в упакованном виде.

Сжатая ZIP-папка

Если на вашем ПК есть утилита WinZip, вам потребуется выполнить следующие действия:

В итоге ZIP-архив будет сохранен там, где вы указали.

Сжатая ZIP-папка

Если у вас есть предустановленная утилита WinRAR, упаковать файлы вы можете после выполнения следующих действий:

По указанному вами пути появится сжатая RAR-папка.

Упакованная WinRAR папка

Есть и еще один простой способ упаковки файлов, если на вашем ПК есть файловый менеджер TOTAL COMMANDER. Для упаковки файлов при помощи него вам потребуется выполнить действия:

Выбрать параметры упаковки, ввести имя архива и нажать ENTER.

Добавление файлов в архив с помощью файлового менеджера Total Commander

Надеюсь, что после прочтения этой статьи вы научились упаковывать файлы и сможете поделиться новыми знаниями с теми, кто об архивировании еще ничего не знает.

Часто в играх можно наблюдать данных запакованные в один или несколько файлов. Какие методики применяют, или какими программами пользуются. Может свои пакеры придумывают. Или как в Ufo Alien Invasion запаковано в zip. Но вот беда, это же ещё надо потом распаковывать, как всё это делается?



Некоторые придумывают свои пакеры, некоторые тупо ксорят, некоторые юзают ZIP с изменённым magic number, некоторые тупо склеивают все файлы в один большой типа game.data, а потом seek'ают по нему в поисках нужных кусков.

В Android-играх часто можно встретить сжатый кеш в формате OBB, который просто монтируется в ФС, а в игру прокидывается путь к файлам игры.

Разных способов тьма. Зависит это от того, насколько разработчики готовы потратить на защиту их текстурок от воровства. Для Homebrew-проектов такое нафиг не нужно.


1. Когда ты уже научишься если не гуглить очевидное, то хоть подробности того, что тебе надо сообщать? Элементарные для самостоятельного поиска (или просто даже подумать головой, как с курсором и пулей) вопросы один за другим.

2. ОК. Какие данные тебе запаковывать надо? Подключаешь либу (gzip, lzma, lzma2), жмёшь соответствующим компрессором, в своей игре — разжимаешь. Или тебе надо чтобы много файлов в один? Тогда вопрос — зачем надо? Просто потому что так делают другие, или всё же какую-то цель преследуешь? Это можно хоть в tar положить, если надо, вопрос только зачем это тебе. А если насчёт сжатия, то смотря какие данные. Для аудио есть opus (для игр в самый раз хватит) или ogg, сильнее не сожмёшь. Для изображений (спрайтов, текстур) есть png. Опять же, поверх png ничем ещё раз жать не требуется. Если требуется более сильное сжатие, чем умеет png, можно посмотреть например FLIF. Он жмёт лучше, но не так распространён (соответственно придётся юзать именно отдельную либу скорее, нежели обойтись средствами какого-нибудь SDL, или чего ты там будешь использовать). Видео можно соответственно тоже жать любым кодеком. Исполняемый файл и либы жать не стоит вообще. Текстов у тебя в игре всё равно много не будет (потому что иначе игрок повесится, с твоим знание русского, не говоря уж об английском). Что жать собрался ещё?

Каждый новичок, изучающий пайтон сталкивается с проблемой упаковки своей программы в единый исполняемый файл.

Поскольку пайтон интерпретируемый язык программирования скомпилировать его в единый файл проблематично. Но не невозможно.

Для решения этой проблемы пайтон-разработчики идут на хитрость: в пакет программы "копируют" интерпретатор пайтон. Однако сделать это нужно правильно. И для этой цели обычно используют либо библиотеку pyinstaller , либо cx_freeze.

Pyinstaller позволяет упаковать программу чуть ли не в 2 клика. Однако если у вас есть дополнительные файлы, либо вы импортировали дополнительные библиотеки, скорее всего, pyinstaller не сможет их найти и у вас ничего не получится.

Поэтому я советую для сложных приложений использовать cx_freeze. И сразу скажу, все не так страшно, как может показаться. Мне удавалось запаковать игры с музыкой, картинками и все работало. Работаю я в Windows, а документацию библиотеки смотри здесь .

Шаг 1.Установка библиотеки cx_Freeze

Устанавливаем библиотеку cx_Freeze с помощью pip.

Вводим в командной строке:

Если появляется ошибка, то попробуйте добавить флаг --user.

Шаг 2. Напишем код, который запакует нашу программу.

В пакете нашей программы создаем файл с названием setup.py, в которую вписываем код, который запакует нашу программу. У меня была игра, и код компилятора выглядел так:

from cx_Freeze import setup, Executable

Шаг 3. Корректируем код

В третьей строке вписываем название файла, запускающего программу и название итогового файла exe.

Конвертировать иконку можно здесь .

В includes и zip_include_packages мы указываем те модули, которые мы использовали, чтобы python не забыл их запаковать.

В include_files мы указываем путь ко всем дополнительным файлам, которое использует наше приложение. Если у вас иерархия папок, а не все файлы скопом лежат в одной, то не забудьте в пути это указать.

В функции options ничего не исправляем.

В setup исправляем name - указываем имя главного файла, в version - версию приложения, а в description - описание приложения.

Ошибка с шрифтами

Шаг 3. Запаковываем.

Выполним запаковку, вбив в командную строку следующее:

У вас должен появиться файл build_windows. Это и есть наш итоговый пакет программы, который мы сможем распространять. Здесь же мы найдем файл .exe, запускающий нашу программу. Для него, например, можно создать ярлык и закинуть его на рабочий стол.

Возможные ошибки.

Если .exe файл выдает ошибку, то скорее всего, вы не указали, либо указали неправильно путь до одного из используемых файлов и программа не может его найти. Этот файл будет указан в ошибке.

Надеюсь у вас все получилось, а если нет, обязательно напишите об этом. И я постараюсь вам помочь.

Читайте также: