Às vezes, os jogos de console e PC têm patches para corrigir erros que os desenvolvedores perderam / não tiveram tempo de corrigir.
Minha pergunta é como isso funciona?
Às vezes, os arquivos de patch têm alguns megabytes de tamanho. Não entendo como um arquivo pequeno pode alterar um programa cumprido.
Respostas:
Existem várias maneiras de fazer isso, o mais simples seria XOR os dois arquivos e compactá-los (GZIP ou mais). A teoria por trás disso é que, esperançosamente, você pode obter uma grande sequência de zeros (longas seqüências dos mesmos valores são compactadas bem).
Você pode levar esse conceito adiante e tentar encontrar áreas dos dois arquivos em que os dados são idênticos e omitir completamente.
Por fim, você pode usar a estrutura de cada tipo de arquivo para sua vantagem. Por exemplo, em um EXE, você pode empacotar cada método individualmente (somente os que foram alterados) e reconstituir você mesmo o EXE durante o aplicativo de patch; lembre-se, no entanto, de que isso é muito provável no reino do exagero e pode não valer o esforço (o ganho em um bdiff simples pode não justificar a complexidade extra que pode ocorrer na natureza). Como outro exemplo, você pode usar arquivos diff para scripts.
No entanto, a maioria dos sistemas de patches na natureza segue o caminho mais simples: eles apenas empacotam arquivos que foram alterados - eles não tentam apenas empacotar as alterações nesses arquivos (provavelmente por um bom motivo, a maioria dos conteúdos do jogo já está compactada e criando patches contra altos entropia ou dados compactados não funcionarão ).
fonte
O código executável de um jogo nem sempre reside apenas no executável, geralmente é dividido em várias bibliotecas dinâmicas (por exemplo, os mecanismos de jogo, gráficos e som), o executável real e, possivelmente, muitos scripts para diversos fins.
Um patch pode corrigir problemas em qualquer uma dessas partes sem justificar a alteração em todas elas.
Uma abordagem diferente da substituição de todos os arquivos alterados poderia ser simplesmente fazer uma comparação binária neles e apenas empacotar as diferenças reais a serem redistribuídas.
(Obviamente, isso funcionará apenas em arquivos que você pode garantir que não serão alterados pelo usuário.)
fonte
Normalmente eles usam um sistema diff binário de terceiros para distribuir patches nos dados do jogo. Os executáveis geralmente são pequenos o suficiente para serem totalmente distribuídos trivialmente.
A maioria dos jogos modernos possui centenas de megas de dados (principalmente texturas, modelos, dados de níveis, etc.). Isso requer patch com bastante frequência. Até onde eu sei, os editores normalmente têm uma maneira proprietária padrão de fazer isso.
Escusado será dizer que existem exemplos de código aberto. Algumas distribuições Linux (Fedora?) Usam diffs binários para seus patches. Você pode investigar isso e ler o código fonte ou a documentação.
fonte
Moderno
diff
Algoritmos podem encontrar com eficiência sequências de bytes comuns entre dois binários. Não surpreendentemente, se você pensar sobre isso. A compactação de arquivos também encontra seqüências de bytes idênticas.Depois de ter a lista de sequências de bytes idênticas, você só precisa enviar as compensações antigas e novas, o comprimento e, claro, qualquer coisa completamente nova. No lado do recebimento, é então uma montagem direta. Copie os bits que você precisa manter do arquivo antigo, preencha os novos bits.
A criação do patch fica ainda mais fácil se o seu vinculador puder cuspir um arquivo MAP que lista os deslocamentos de todas as funções no arquivo.
fonte