C贸mo hacer una actualizaci贸n autom谩tica de un cliente de juego en l铆nea

En este art铆culo, hablar茅 sobre c贸mo hice un sistema de actualizaci贸n autom谩tica para un juego de cliente en l铆nea. Enlace a la fuente (Delphi) al final del art铆culo. De hecho, implement茅 tal caracter铆stica en mis dos juegos, y si el primer panqueque sali贸 un poco irregular (en el juego Spectromancer), entonces la segunda implementaci贸n result贸 ser muy conveniente y efectiva. Este es mi primer art铆culo sobre Habr茅, as铆 que no golpees con fuerza, sino que se帽ala los defectos en los comentarios :)

Algoritmo de actualizaci贸n del juego


  • Comprobando la versi贸n para actualizar.
  • Descargue la lista de archivos de la versi贸n actual.
  • Descargar archivos nuevos o modificados a una carpeta temporal.
  • Instalaci贸n de la actualizaci贸n: trae los archivos del cliente instalado de acuerdo con la lista.
  • Iniciando un cliente actualizado.

Verificaci贸n de versi贸n


En primer lugar, al iniciar, el cliente solicita al servidor el n煤mero de la versi贸n actual (X) y el n煤mero m铆nimo permitido sin actualizar (Y). Si la versi贸n del cliente no es inferior a Y, no se requiere una actualizaci贸n; de lo contrario, el cliente inicia la utilidad de actualizaci贸n " GetNewVersion.exe X " y se apaga.

Como puede ver, el par谩metro pasa el n煤mero de versi贸n; esto le permite actualizar el juego a cualquier versi贸n disponible en el servidor e incluso reducirlo. Si no se pasa el par谩metro, la utilidad solicitar谩 el n煤mero de versi贸n actual del servidor. El n煤mero de versi贸n es solo un n煤mero entero, el esquema de numeraci贸n puede ser cualquiera, por ejemplo, mi versi贸n 1.12 corresponde al n煤mero 1120.

La respuesta del servidor no llega instant谩neamente, y antes de que la recibamos, no podemos crear la ventana del juego, ya que es posible que deba cerrarla de inmediato, y el parpadeo incomprensible en la pantalla no es lo que necesitamos. El tiempo de espera de respuesta deber铆a tomar algo, y el cliente est谩 ocupado cargando / desempacando los archivos JPEG m谩s pesados. Tampoco puedes esperar demasiado: el jugador lanz贸 el juego, pero no sucede nada en la pantalla, es un desastre. Por lo tanto, si dentro de 1.0 seg. la respuesta del servidor no lleg贸: la carga del juego contin煤a de la manera habitual. Esto no es gran cosa: tan pronto como el jugador intente iniciar sesi贸n en el servidor, recibir谩 un mensaje sobre la necesidad de actualizar el cliente o que el servidor no est谩 disponible.

Descargar lista de archivos


Conociendo el n煤mero de versi贸n, la utilidad de actualizaci贸n descarga la lista de archivos en: [base_ur]>/[]/filelist
Esta es solo una lista de archivos CSV con sumas de verificaci贸n, as铆 como tama帽os comprimidos y sin comprimir, cada l铆nea se ve as铆:
18*Priest.tga;1053151921D9;91719;107372
Aqu铆 "18 *" significa que 18 caracteres en el nombre del archivo son los mismos que el archivo anterior. Dado que los archivos generalmente van en orden alfab茅tico, y las rutas pueden ser largas, esto ahorra significativamente el tama帽o del archivo de lista. Para un servidor web en el que la compresi贸n no est谩 habilitada, esto significa que el archivo se descargar谩 m谩s r谩pido y la actualizaci贸n comenzar谩 antes.

Descargar archivos nuevos o modificados


No sabemos cu谩ntos a帽os tiene el cliente del juego, tal vez algunos archivos se hayan cambiado o eliminado manualmente. No queremos descargar demasiado, por lo tanto, despu茅s de recibir la lista de archivos, la utilidad comienza a verificarlos para obtener actualizaciones: si el archivo falta en la carpeta del juego o su suma de comprobaci贸n es diferente, el archivo se agrega a la cola de descarga. Al mismo tiempo, no se pueden cargar m谩s de 2 archivos; esto es suficiente para que, por un lado, la descarga no se ralentice, pero por otro lado, se produce de forma secuencial.



Un tema especial es la visualizaci贸n del progreso. Hasta que se haya procesado toda la lista, no sabemos exactamente cu谩ntos archivos descargar y de qu茅 tama帽o son. Sin embargo, tan pronto como se carga el primer archivo, ya podemos mostrar cierta informaci贸n. De hecho, el progreso muestra la cola de descarga: cu谩nto descargar y cu谩nto ya se ha descargado.

Los archivos descargados se descomprimen inmediatamente y se guardan en una carpeta temporal. Utilizo la biblioteca zlib para la compresi贸n.

Cuando se ha procesado la lista completa de archivos y se han completado todas las descargas, la utilidad verifica la presencia del archivo changes.txt y, si existe, lo muestra. Se le solicita al usuario que inicie el procedimiento de actualizaci贸n. Antes de hacer clic en el bot贸n "Actualizar", todav铆a no se han realizado cambios en la carpeta del juego, por lo que puede optar por no participar sin ning煤n problema.

Por cierto, si el usuario interrumpe la descarga o se niega a instalar, la pr贸xima vez no tendr谩 que descargar todos los archivos nuevamente: antes de descargar el siguiente archivo, la utilidad verifica su presencia en la carpeta temporal y si la suma de verificaci贸n coincide, la descarga se considera exitosa.



Pero cuando hace clic en "Actualizar", la utilidad inicia otra utilidad: " InstallUpdate.exe ", y se apaga.

Instalar actualizaci贸n


驴Por qu茅 necesito otra utilidad? Es simple: para actualizar los archivos del juego, debe ejecutar con derechos de administrador. Pero para descargar la actualizaci贸n, por el contrario, est谩 contraindicada. Porque, a menos que sea un feliz propietario de un certificado de firma de c贸digo EV, comenzar el proceso con derechos de administrador mostrar谩 la ventana UAC. Y si, al comenzar el juego, en lugar de la interfaz habitual, el jugador ve esto:



... entonces esta es, al menos, una raz贸n para tener cuidado, o incluso abandonar por completo el lanzamiento. Otra cosa, con el consentimiento manual para instalar la actualizaci贸n, en este contexto, la ventana de UAC se percibe normalmente. Desafortunadamente, un proceso en Windows no puede elevar sus derechos en tiempo de ejecuci贸n; esta propiedad no ha cambiado desde su lanzamiento. Por lo tanto, uso dos archivos separados. De hecho, GetNewVersion.exe e InstallUpdate.exe son la misma utilidad, los archivos son id茅nticos. Y la acci贸n est谩 determinada por los par谩metros transmitidos y el nombre del archivo ejecutable.

Entonces, al iniciarse, InstallUpdate copia los archivos del cliente del juego desde la carpeta temporal a la carpeta del juego, y luego inicia el cliente actualizado y finaliza. En este caso, el archivo GetNewVersion.exe tambi茅n se puede actualizar.

Todas las acciones, as铆 como los errores que ocurren, se registran en detalle en el registro; esto es muy 煤til para la depuraci贸n.

El proceso de preparaci贸n de una nueva versi贸n.


Examinamos el esquema de operaci贸n de actualizaci贸n desde el punto de vista del cliente del juego, pero 驴c贸mo hacer que todo funcione? Para preparar nuevas compilaciones, escrib铆 otra utilidad: CompressBuild . Escanea recursivamente una carpeta, comprime archivos usando el m茅todo Deflate y escribe informaci贸n sobre ellos en la lista de archivos: lista de filelist . Despu茅s de la compresi贸n, el s铆mbolo "_" se agrega al nombre del archivo. Los archivos comprimidos no se comprimen nuevamente, por lo tanto, si es necesario, solo los archivos individuales se pueden actualizar en la carpeta de compilaci贸n, CompressBuild solo los actualizar谩.

Algunos archivos en el cliente del juego cambian durante la operaci贸n, por ejemplo, contienen configuraciones. Dichos archivos deben ignorarse, la utilidad toma las plantillas apropiadas del archivo de exclusi贸n. Es decir, estos archivos simplemente no entran en la lista de filelist y no se estropean en el cliente cuando se actualizan.

Por lo tanto, para preparar una nueva compilaci贸n, necesito:

1. Copie la carpeta \master en \[_]
2. Ejecute CompressBuild , que empacar谩 los archivos y har谩 una lista de ellos.
3. Sube todo al sitio web del juego.
4. Cambie en el servidor del juego el n煤mero de la versi贸n actual al n煤mero que acaba de descargar. Voila!

A partir de ahora, al actualizar, las personas recibir谩n una nueva versi贸n.

Bueno, las carpetas con compilaciones antiguas en el servidor se pueden eliminar para no ocupar espacio.

Conclusi贸n


Por supuesto, mi sistema de actualizaci贸n no es perfecto y no tiene fallas. Por ejemplo, si se elimin贸 un archivo en el cliente, permanecer谩 con los reproductores. Si el archivo ha cambiado de nombre, se descargar谩 como nuevo y la instancia anterior no se eliminar谩. Por supuesto, puede refinar la utilidad de actualizaci贸n agregando comandos para eliminar / cambiar el nombre de los archivos a la lista de archivos, pero en general estos problemas no son relevantes para mi juego, por lo que no me molest茅.

Bueno, puedes obtener la fuente aqu铆: astralheroes.com/files/UpdaterSrc.zip
(compilado en Delphi-2006 / Turbo Delphi, no puedo responder por otros compiladores).

Source: https://habr.com/ru/post/es423207/


All Articles