¿Cómo debo rastrear las posiciones en tiempo real de los jugadores en un MMO?
14
¿Cómo hace un seguimiento de las posiciones de los jugadores en un MMORPG? Leí que puede usar una base de datos o puede almacenar las coordenadas en archivos. Intenté usar una base de datos pero era lenta. ¿Cómo se pueden usar los archivos para realizar un seguimiento de las posiciones de los jugadores?
¿Cómo se pueden usar los archivos para realizar un seguimiento de las posiciones de los jugadores?
Escribe la posición del jugador en el archivo. Por ejemplo, si identifica a cada jugador con un número único (o un GUID), podría usarlo como nombre de archivo. En el archivo, simplemente escriba los datos de posición en un formato que pueda analizar más adelante. Por ejemplo, 467239.txtpodría contener 20, 3, 19si el jugador # 467239 está en esa ubicación ( x, y, z ).
Sin embargo, esto no es tan diferente de lo que haría con una base de datos: una base de datos no debe ser "lenta" en esta operación, debe ser muy rápida (probablemente más rápida que los archivos, porque tiene más sobrecarga de E / S de disco o bloqueo de E / S) contención, si almacenó múltiples posiciones por archivo, en un enfoque basado en el sistema de archivos).
¿Quizás intentabas usar la base de datos o el sistema de archivos para almacenar la posición del jugador en tiempo de ejecución ? No deberías hacer esto en absoluto .
En el tiempo de ejecución, en su servidor, las posiciones de los jugadores deben mantenerse en la memoria y actualizarse allí, como lo haría con cualquier otro tipo de juego. Periódicamente se pueden guardar en el disco u otro almacenamiento persistente, por ejemplo, cuando el reproductor descansa, guarda o cierra la sesión.
Pero escribir cada posición de los jugadores en el almacenamiento de cada actualización es innecesario y extremadamente ineficiente; nunca será lo suficientemente rápido como para manejar algo parecido a escalas de jugador "masivas".
Sí, en realidad, estaba guardando la posición del jugador en un postgreSQL en tiempo de ejecución. Pero, si lo guardo en la memoria del servidor, ¿cómo puedo actualizar la posición en los clientes?
Baccari
12
El método por el cual se actualiza el cliente es el mismo en todos los casos: el servidor le dice al cliente cuál es su posición a través de un mensaje de red (o de manera más realista, el cliente, que está haciendo predicción local, también tiene una posición local que el servidor valida y confirma para el cliente). No debe hacer que su cliente acceda a la base de datos a la que accede el servidor.
1
Echo de menos el punto de decir "hazlo con un archivo", solo para explicar que en realidad es peor que usar el db y luego explicar cuál es el verdadero problema. ¿Por qué necesitas esa explicación de archivo inútil en primer lugar? Solo confunde al lector casual, que no beneficia a nadie.
o0 '.
66
Según mi experiencia en el pasado, ignorar las preguntas directas y simplemente proceder a dar una conferencia sobre lo que creo que "la forma correcta" debería ser más conflictiva y hace que el OP sea menos receptivo a ser guiado lejos de los cimientos más débiles, su pregunta original es viniendo de, eso es todo.
13
La posición debe estar en la RAM mientras está en uso. (Ej: el personaje del jugador está en el mundo) No puede usar el DB como memoria operativa. Bueno, puedes, pero esto será terrible.
Debe guardar las posiciones regularmente, pero no cada vez que cambian.
También evitaría guardar todas las posiciones al mismo tiempo. Si desea mantener la persistencia en caso de un bloqueo del servidor, debe guardar la posición con la mayor frecuencia posible pero en el tiempo libre del juego. Simplemente haz esto por lotes.
Ahorre 30 posiciones mientras el tiempo libre esté disponible.
En cuanto a los clientes. Deben recibir actualizaciones (relevantes) del estado del juego a través de una conexión al software de su servidor. No del DB ... Eso sería poco práctico, lento, malo, malo y la fuerza se vería perturbada.
Lo que hago en mi servidor es almacenar la dirección de los jugadores (vector) y la última posición, si el jugador tiene velocidad, calculo la nueva posición de los jugadores cada 2 segundos.
El cliente tiene su propia posición de posición, por supuesto, y le envía una nueva dirección (vector) al servidor.
El servidor tiene autoridad sobre la posición y envía un paquete de posición si el cliente se movió una cierta distancia desde la última verificación (esto puede provocar un efecto de banda elástica si el cliente no está sincronizado).
La posición debe estar en la RAM mientras está en uso. (Ej: el personaje del jugador está en el mundo) No puede usar el DB como memoria operativa. Bueno, puedes, pero esto será terrible.
Debe guardar las posiciones regularmente, pero no cada vez que cambian.
También evitaría guardar todas las posiciones al mismo tiempo. Si desea mantener la persistencia en caso de un bloqueo del servidor, debe guardar la posición con la mayor frecuencia posible pero en el tiempo libre del juego. Simplemente haz esto por lotes.
Ahorre 30 posiciones mientras el tiempo libre esté disponible.
En cuanto a los clientes. Deben recibir actualizaciones (relevantes) del estado del juego a través de una conexión al software de su servidor. No del DB ... Eso sería poco práctico, lento, malo, malo y la fuerza se vería perturbada.
fuente
Tengo un hilo separado que hago cola para guardar en los archivos cada 500 o más ticks del juego. De lo contrario, debe almacenar todo en RAM.
fuente
Lo que hago en mi servidor es almacenar la dirección de los jugadores (vector) y la última posición, si el jugador tiene velocidad, calculo la nueva posición de los jugadores cada 2 segundos.
El cliente tiene su propia posición de posición, por supuesto, y le envía una nueva dirección (vector) al servidor.
El servidor tiene autoridad sobre la posición y envía un paquete de posición si el cliente se movió una cierta distancia desde la última verificación (esto puede provocar un efecto de banda elástica si el cliente no está sincronizado).
Todo esto sucede en la memoria, por supuesto.
fuente