Y ya, con esta entrada terminamos la saga (I, II, III) hablando de los juegos en línea. ¡Mañana más material interesante y menos tocho!
Diseño de juego en linea persistentes
Son juegos completamente en línea y están pensados para permitir jugar a un gran número de jugadores (millones), y es por ello que usan suscripciones mensuales para el mantenimiento de los servidores.
En estos campos aparecen dos figuras, administrador de red y administrador de bases de datos y la arquitectura del sistema se diseña con más cuidado por los siguientes motivos:
- El diseño es mucho más complejo, ya que se tiene que decidir qué partes se ejecutan en el cliente y qué partes se ejecutan en el servidor.
- El sistema tiene que estar preparado para soportar todos los jugadores que van a utilizar el juego simultáneamente.
- La cantidad de información que se transmite entre cliente y servidor es mucho mayor.
- Todos los datos se guardan en el servidor, así que nos tenemos que encargar de que estos datos se encuentren siempre disponibles.
- Los clientes que corren la interfaz gráfica para que puedan interactuar con el entorno.
- Los servidores que ejecutan el código del juego y deciden lo que está pasando en todo momento.
- Los servidores de bases de datos que guardan toda la información referente a los usuarios y algunos datos sobre el estado del juego.
Una posibilidad es utilizar varias bases de datos conectadas entre sí mediante un sistema de balanceo de carga para mejorar la eficiencia del proceso. Es clave también realizar copias de seguridad periódicas ya que un problema afectaría directamente a todos los usuarios del juego. La comunicación mediante los servidores y la base de datos normalmente se realiza mediante comandos SQL.
La arquitectura del cliente es lo que denominamos cliente tonto. Este tipo de terminales tan sólo sirve para recoger la entrada del usuario, enviarla al servidor y esperar la respuesta del servidor para mostrarla por pantalla.
Esto nos da la posibilidad de dedicar todos los recursos del sistema para potenciar el entorno gráfico y sonoro, ya que no tenemos que dedicar la CPU para hacer cómputos de inteligencia artificial o de colisiones (de esto ya se encarga el servidor). Por lo que en este campo es más importante la interfaz de red y la de interfaz.
Una de las grandes ventajas de separar la parte gráfica de la parte lógica es que podemos diseñar varios tipos de clientes que se ajusten a las capacidades hardware de los usuarios.
La arquitectura del servidor está construido básicamente por tres componentes:
- Una interfaz de red que nos permita comunicarnos con el servidor de bases de datos.
- Una interfaz que nos permita comunicarnos con los clientes. Este sistema tiene que estar muy bien optimizado, ya que la cantidad de datos recibidos/enviados es enorme.
- El elemento más importante es lo que llamamos un 'engine lógico'. Este engine se encarga de gestionar todas las entradas de los jugadores y del sistema de inteligencia artificial y de decidir qué está ocurriendo en cada paso.
Como la cantidad de usuarios puede ser muy grande, se usan varios servidores para balancear carga. Hay dos técnicas para distribuir usuarios entre servidores:
- Crear varios servidores a los cuales los clientes se pueden conectar, conocidos como reinos (realms). Cada uno de estos servidores contiene una copia completa del mundo, y no se puede transferir la información de un usuario de un mundo al otro. Algunos juegos como World of Warcraft aplican diferentes reglas a cada uno de estos servidores, lo que amplía las posibilidades multijugador del juego.
- La segunda opción es lo que se conoce por una subdivisión espacial del mundo. Este sistema es mucho más complejo. Consiste en recortar el mapa en varias zonas y colocar la gestión de cada una de ellas en un servidor diferente. Se debe tener en cuenta que esta división no tiene por qué hacerse en tamaños equivalentes. Tendremos que estudiar la densidad de población en cada una de las zonas del mundo y dividir para que el número de usuarios sea parecido en todas ellas.
Normalmente, el salto entre dos zonas distintas se realiza mediante lo que se conoce como un "portal", que es la representación gráfica de un salto de una zona a la otra. Aun así, existen técnicas más profesionales para evitar esa impresión de cambiar de mundo.
Uno de los problemas más comunes en las partidas de red es que los paquetes con información de lo que están haciendo los otros jugadores no llegan de forma constante. Puede haber todo tipo de problemas de comunicación. Para poder anticiparse y resolverlo, tenemos varias técnicas:
- Mejorar la comunicación a nivel de red
La primera opción que tenemos para mejorar nuestro sistema es a nivel de hardware, sistema operativo y conexión hacia Internet. Estas mejoras se realizan normalmente a base de invertir más dinero en infraestructura, ya que no se pueden realizar mediante programación. - Optimización del protocolo y de la secuencia de conexión
Ya comentados antes como son enviar el mínimo de paquetes e información. Una cosa a añadir es la mensajería jerárquica. Se trata de adaptar la cantidad de información enviada según las diferentes velocidades de los clientes. La técnica consiste en asignar una cierta prioridad a los mensajes que vamos a enviar y decidir si lo transmitimos o no dependiendo de la importancia que tenga para el correcto funcionamiento del juego. - Predicción de los movimientos de los jugadores
El cliente siempre tiene que estar intentando saber cuál es el próximo movimiento que van a realizar. Cada vez que recibe del servidor una posición y una orientación, simplemente hemos de corregir parcialmente la posición. Podemos utilizar algoritmos que hagan esta transición de forma simple, para que no veamos cambios bruscos en las posiciones. Un buen algoritmo de predicción necesita dos componentes principales. Los datos históricos y un buen sistema de predicción. De todas formas, por buenos que sean, no lo conseguiremos nunca al 100%.
En algunos juegos en línea, la predicción da lugar a situaciones bastante extrañas o cómicas. Aunque la sensación de que estamos jugando es bastante continua, si ha habido un corte en la red puede ser que aparezcamos de repente en un punto donde nos encontrábamos hace un buen rato. Esto es debido a que cuando se recupera la conexión vemos que existe una gran diferencia entre el estado del cliente y el del servidor, con lo que el servidor nos vuelve a situar en la ultima posición que él conocía como buena. - Envío de acciones en lugar de posiciones/estado
Para que este sistema funcione todos los clientes tienen que ejecutar la misma versión del juego, a la misma velocidad de ejecución y este debe ser totalmente determinista. El elemento clave en el sistema es la sincronización inherente. Aunque no se envían mensajes, si el juego está bien implementado, se supone que todos los sistemas deben estar sincronizados en todos los ciclos de ejecución. Cada cierto tiempo se debe llevar un testeo de sincronización. Un solo fallo de sincronización no tiene solución y conllevará la finalización de la partida.
La seguridad es importante por tres razones principales:
- Para proteger la información sensitiva de los usuarios
- Para evitar suplantaciones de personalidad
- Para proporcionar un entorno de juego justo. La protección de la conexión se puede realizar mediante diversas técnicas:
- En cuanto a la red o al transporte, podemos filtrar paquetes extraños o maliciosos.
- En cuanto a la aplicación, podemos proteger los datos cifrando la información contenida en los paquetes. Sólo es recomendable aplicar esta técnica en momentos puntuales ya que el cifrado conlleva gasto de cpu.
- Otra alternativa es utilizar un software externo para gestionar la seguridad de nuestra aplicación.
Al instalar el juego, instalamos también una pequeña aplicación que corre en paralelo al juego y que detecta cualquier intento de ataque o trampa.
Adicionalmente, este tipo de servicios mantienen una base de datos sobre usuarios "baneados" (usuarios a los que se ha descubierto intentando realizar alguna acción ilegal), a los que ya no se permite acceder al juego.
Herramientas adicionales, autopatchers: Se trata de un componente que permite actualizar el sistema de forma transparente al usuario.