В консольных и компьютерных играх иногда есть исправления для исправления ошибок, которые разработчики пропустили / не успели исправить.
Мой вопрос, как они работают?
Иногда размер файла патча составляет несколько мегабайт. Я не понимаю, как маленький файл может изменить выполненную программу.
Ответы:
Есть несколько способов сделать это, самым простым будет XOR двух файлов и сжатие их (GZIP или так далее). Теория, лежащая в основе этого, состоит в том, что мы надеемся, что вы можете получить большую последовательность нулей (длинные последовательности с одинаковыми значениями хорошо сжимаются).
Вы можете продолжить эту концепцию и попытаться найти области двух файлов, в которых данные идентичны, и полностью их опустить.
Наконец, вы можете использовать структуру каждого типа файлов в ваших интересах. Например, в EXE вы можете упаковать каждый метод отдельно (только те, которые были изменены) и восстановить EXE самостоятельно во время применения патча; имейте в виду, однако, что это очень вероятно в области избыточного убийства и может не стоить усилий (выигрыш по сравнению с простым bdiff может не оправдать дополнительную сложность, которая может сломаться в дикой природе). В качестве другого примера вы можете использовать файлы diff для скриптов.
Однако большинство систем исправлений в дикой природе выбирают самый простой путь: они просто упаковывают файлы, которые изменились - они не пытаются упаковывать только изменения в этих файлах (вероятно, по уважительной причине, большая часть игрового контента уже сжата и создает исправления для больших энтропия или сжатые данные не будут работать вообще ).
источник
Исполняемый код игры не всегда находится только в исполняемом файле, часто он делится на несколько динамических библиотек (например, игровой, графический и звуковой движки), фактический исполняемый файл и, возможно, множество сценариев для различных целей.
Патч может исправлять проблемы в любой из этих частей, не требуя изменений во всех из них.
Другой подход , чем замена всех измененных файлов может быть просто сделать бинарный диф на них, и только packackge фактические различия , которые будут перераспределены.
(Это, конечно, будет работать только с файлами, которые, как вы можете гарантировать, не будут изменены пользователем.)
источник
Обычно они используют стороннюю двоичную систему сравнения для распространения патчей к игровым данным. Исполняемые файлы, как правило, достаточно малы, чтобы их можно было полностью распределить.
Большинство современных игр содержат сотни мегабайт игровых данных (в основном текстуры, модели, данные уровней и т. Д.). Это требует исправления довольно часто. Насколько я знаю, у издателей обычно есть стандартный запатентованный способ сделать это.
Излишне говорить, что есть примеры с открытым исходным кодом. Некоторые дистрибутивы Linux (Fedora?) Используют бинарные различия для своих патчей. Вы можете исследовать их и прочитать их исходный код или документацию.
источник
Современные
diff
алгоритмы могут эффективно находить последовательности байтов, которые являются общими для двух двоичных файлов. Не удивительно, если вы думаете об этом. Сжатие файлов также зависит от нахождения идентичных последовательностей байтов.Когда у вас есть список идентичных последовательностей байтов, вам просто нужно отправить старое и новое смещения, длину и, конечно, все, что является абсолютно новым. На принимающей стороне это простая сборка. Скопируйте биты, которые нужно сохранить из старого файла, заполните новые биты.
Создание патча становится еще проще, если ваш компоновщик может выпустить файл MAP, в котором перечислены смещения каждой функции в файле.
источник