Los juegos de consola y PC tienen parches a veces para corregir errores que los desarrolladores se perdieron / no tuvieron tiempo de arreglar.
Mi pregunta es ¿cómo funcionan estos?
A veces, los archivos de parche tienen unos pocos megabytes de tamaño. No entiendo cómo un archivo pequeño puede alterar un programa cumplido.
Respuestas:
Hay varias formas de hacer esto, la más simple sería XOR los dos archivos y comprimirlos (GZIP, etc.). La teoría detrás de esto es que con suerte puede obtener una gran secuencia de ceros (las secuencias largas de los mismos valores se comprimen bien).
Puede llevar ese concepto más allá e intentar encontrar áreas de los dos archivos donde los datos son idénticos y omitirlos por completo.
Finalmente, puede utilizar la estructura de cada tipo de archivo para su ventaja. Por ejemplo, en un EXE, puede empaquetar cada método individualmente (solo los que han cambiado) y reconstituir el EXE usted mismo durante la aplicación del parche; tenga en cuenta, sin embargo, que esto es muy probable en el ámbito de la exageración y puede que no valga la pena el esfuerzo (la ganancia sobre un bdiff simple puede no justificar la complejidad adicional que podría romperse en la naturaleza). Como otro ejemplo, podría usar archivos diff para scripts.
Sin embargo, la mayoría de los sistemas de parches en la naturaleza toman la ruta más simple: simplemente empaquetan los archivos que han cambiado, no intentan empaquetar solo los cambios dentro de esos archivos (probablemente por una buena razón, la mayoría del contenido del juego ya está comprimido y crea parches contra altos niveles). la entropía o los datos comprimidos no funcionarán en absoluto ).
fuente
El código ejecutable de un juego no siempre reside solo en el ejecutable, a menudo se divide en varias bibliotecas dinámicas (por ejemplo, el juego, los gráficos y los motores de sonido), el ejecutable real y posiblemente muchos scripts para diversos fines.
Un parche podría solucionar problemas en cualquiera de estas partes sin garantizar un cambio en todas ellas.
Un enfoque diferente al reemplazo de todos los archivos modificados podría ser simplemente hacer una diferencia binaria en ellos, y solo empacar las diferencias reales para redistribuirlas.
(Eso, por supuesto, solo funcionará en archivos que puede garantizar que el usuario no cambiará).
fuente
Normalmente usan un sistema de diferencias binario de terceros para distribuir parches a los datos del juego. Los ejecutables suelen ser lo suficientemente pequeños como para ser distribuidos trivialmente por completo.
La mayoría de los juegos modernos tienen cientos de megas de datos del juego (principalmente texturas, modelos, datos de niveles, etc.). Estos requieren parches con bastante frecuencia. Hasta donde sé, los editores normalmente tienen una forma patentada de hacer esto.
No hace falta decir que hay ejemplos de código abierto. Algunas distribuciones de Linux (¿Fedora?) Usan diferencias binarias para sus parches. Puede investigarlos y leer su código fuente o documentación.
fuente
Los
diff
algoritmos modernos pueden encontrar eficientemente secuencias de bytes que son comunes entre dos binarios. No es sorprendente, si lo piensas. La compresión de archivos también se basa en encontrar secuencias de bytes idénticas.Una vez que tenga la lista de secuencias de bytes idénticas, solo necesita enviar las compensaciones antiguas y nuevas, la longitud y, por supuesto, cualquier cosa que sea completamente nueva. En el lado receptor, se trata de un montaje sencillo. Copie los bits que necesita conservar del archivo anterior, complete los nuevos bits.
Crear el parche se vuelve aún más fácil si su enlazador puede escupir un archivo MAP que enumera las compensaciones de cada función en el archivo.
fuente