Almacenar coordenadas de cada objeto en el lado del servidor en MMO


12

En un MMORPG:

¿Es típico o factible almacenar las coordenadas de cada árbol, arbusto, roca, etc. en el lado del servidor para la detección de colisiones?

Si es así, ¿cuál sería una forma factible de almacenar una cantidad tan enorme de coordenadas (estructuras de datos y tales, manejo de problemas de rendimiento)?

Si no es así, ¿este tipo de detección de colisión se realiza completamente en el lado del cliente, con el servidor sin verificar en absoluto?

¿O hay un término medio, con el cliente verificando la colisión y el servidor verificando? Si es así, ¿cómo verificaría el servidor lo mismo sin mantener también las coordenadas en el servidor?


2
No sé lo suficiente sobre esto para dar una buena respuesta, pero si hace la detección de colisión solo en el lado del cliente, los tramposos encontrarán una forma de atravesar todo o recoger potenciadores que están a millas de distancia de ellos.
Peethor

2
-1 "La pregunta no muestra ningún esfuerzo de investigación".
Vaillancourt


En realidad, probablemente no es un duplicado, aprendí acerca de los esquemas de partición espacial y las estructuras de datos espaciales que la otra pregunta no tenía
Sajith Dilshan Jamal

Respuestas:


15

Independientemente de la viabilidad (sí, dependiendo de la escala), a menudo hay formas mejores o más fáciles.

Por ejemplo, en su MMO típico, el servidor realmente solo necesita saber sobre el mapa de navegación aproximado utilizado por AI y la búsqueda de rutas de jugadores. En lugar de almacenar la ubicación de un árbol, puede simplemente hacer un agujero en el mapa de navegación en la ubicación del árbol. Del mismo modo para cualquier otro gran obstáculo.

Incluso los juegos que necesitan una detección de colisión más profunda, a menudo puede dividir esto en detección del lado del servidor y del cliente. El servidor solo puede preocuparse por la ruta gruesa mientras el cliente maneja una detección de colisión más sensible a la animación. Por ejemplo, un jugador herido intenta arrastrarse a lo largo de una gran roca para encontrar un escondite de los enemigos. El servidor determina que un jugador puede mover a lo largo del borde de la roca (el servidor no tiene idea de que es una roca, sólo que hay un camino que el jugador puede tomar junto a una zona unpathable), mientras que el cliente sabe que la roca está presente y reproduce una animación del personaje apoyándose contra la roca mientras camina. Tenga en cuenta que el cliente no se mueveel personaje o el juego impactante de cualquier manera en este caso; solo está reaccionando a los objetos cercanos con una animación.

Ciertamente puede almacenar grandes cantidades de objetos en el servidor. No es diferente a cualquier juego de mundo abierto. Utilice un buen esquema de partición espacial y mantenga la huella de memoria de sus objetos lo más ligera posible. Tenga en cuenta que podemos tener diferentes versiones de "grandes números" en nuestras cabezas aquí: si quería decir que quería almacenar cada pequeño guijarro o roca en el juego como un objeto separado, entonces eso es una tontería, incluso para un juego de un solo jugador . :)


7

Sí, es factible. Los MMO a menudo dividen el mundo del juego en múltiples áreas, ya que esto facilita el trabajo, pero aún puede hacerlo con 1 área masiva: solo necesita usar un buen esquema de partición espacial.

Debido a que la mayoría de los objetos en los MMO no se mueven, también puedes realizar un pase de preprocesamiento donde los objetos se usan para crear árboles de verificación de colisión.

La huella de memoria no es un gran problema aquí, siempre y cuando use la creación de instancias. Almacenar un par de flotadores por objeto no es nada en el gran esquema de las cosas. Una PC modesta hoy en día tendrá 4 gigabytes, mientras que el almacenamiento de una posición es de solo 3 flotadores (o 3 dobles), lo que permitiría fácilmente varios millones de objetos almacenados en el juego.

Sin duda, almacenar cosas como inventarios para cada jugador tomaría más datos, aunque eso puede almacenarse fácilmente en el caché en el disco y solo cargarse cuando un jugador inicia sesión.

Deberá realizar una verificación de colisión redundante tanto en el cliente como en el servidor, ya que esto permitirá que el cliente reaccione de manera más receptiva al entorno. Si un jugador se topa con una pared, quiere que deje de moverse inmediatamente, no después de medio segundo cuando el servidor responde.

Solo desea utilizar el servidor para cosas autoritativas también. Por ejemplo, realizaría la búsqueda de ruta solo en el cliente, ya que no puede hacer trampa tomando una ruta menos eficiente.


gracias por el consejo sobre los esquemas de partición espacial, aprendí algo nuevo
Sajith Dilshan Jamal
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.