Simulaciones físicas del lado del servidor con cientos de jugadores.

9

Actualmente estoy trabajando en un juego orientado a la física para un jugador en el que me gustaría simular la física del lado del servidor. Esto se debe a que el juego tendrá tablas de clasificación, progresión persistente del jugador, etc.

Sin embargo, el problema es que el juego probablemente será jugado por cientos (quizás miles) de personas al mismo tiempo. Esto me preocupa, ya que probablemente matará la potencia de procesamiento del servidor si tengo que hacer y mantener cientos de estados al mismo tiempo.

No tendría problemas para mover todas las simulaciones físicas al lado del cliente, pero realmente necesitaría una forma de validar si el resultado de una simulación del cliente es válido. Sin embargo, no puedo entender cómo.

He pensado ejecutar la simulación del lado del servidor de vez en cuando para validar si el cliente todavía está jugando limpio, pero realmente quiero que el servidor tenga la menor tensión posible.

La física se volverá tan compleja como la demostración de GDC 2011 de Glenn Fiedler , tal vez incluso más simple. Sin embargo, muchos más cuerpos rígidos que siempre chocan estarán en una sola escena y todos serán visibles a la vez.

Me resulta difícil obtener una respuesta a este caso en particular, ya que la mayoría de los recursos en la web, una vez más, el sitio Glenn Fiedlers es excelente, habla sobre física en red a pequeña escala (por ejemplo, un FPS con 30 jugadores, como Halo).

Cualquier consejo, sitios web, documentos o similares sobre el tema serán muy apreciados.

Un resumen de las preguntas a las que me gustaría una respuesta:

  • ¿Qué tan factible es un modelo cliente-servidor? ¿Mi preocupación por el poder de procesamiento del servidor es legítima y está fundada?
  • ¿Es posible validar de manera confiable una simulación física ejecutada por el cliente en el servidor? ¿Si es así, cómo?
Lennard Fonteijn
fuente
Dejaré esta pregunta abierta un poco más con la esperanza de que más personas publiquen sus pensamientos. ¡Agradezco a quienes ya lo hicieron!
Lennard Fonteijn
Mientras los diferentes clientes sean independientes, no debería tener problemas para escalar horizontalmente. Use algo como EC2, ponga capacidad en línea según sea necesario.
Ipeet
1
¿Dónde está el problema si alguien hace trampa en un juego para un jugador? Solo déjelos, mejor deje caer la idea de la tabla de clasificación y concéntrese en hacer un juego divertido para un solo jugador
Maik Semder
2
"¿Es posible validar de manera confiable una simulación física ejecutada por el cliente en el servidor?" Sí, es posible validarlo, pero leyendo sus comentarios a continuación: su plan de dar dinero RL a las mejores puntuaciones, y es similar a un juego de dardos, es decir, después del lanzamiento inicial, la física se hace cargo. El problema aquí es menos para validar la física, esto es fácil. El problema es que tendrás tramposos que dejarán que un programa de computadora haga el tiro para darles puntajes perfectos.
Daniel Carlsson
La física validada por el servidor en un mundo compartido es completamente posible, DCUO es un buen ejemplo de esto. Tenga en cuenta que "servidor" realmente significa "un montón de cuadros de servidor", mientras que parece escribir en términos de un "servidor" que es un cuadro único en algún lugar. Actualmente no puede simular miles de actores independientes en el mismo espacio físico, por lo tanto, la falta de discusión al respecto; lo que puedes hacer es esparcir a miles de jugadores en islas independientes de simulación que no interactúan.
Patrick Hughes

Respuestas:

5

Puede validar los envíos del lado del cliente de otros usuarios y hacer que el cliente informe al servidor si un envío parece no válido.

Luego puede tomar medidas (ya sea prohibir al tramposo o prohibir quién falsificó el informe falso). Para comprobar si esa presentación es realmente inválida o no, puede usar un cliente especial o lo que sea.

o0 '.
fuente
3
¡Eso es realmente muy inteligente! No habría pensado en eso, obviamente al menos 2 o 3 clientes tendrían que ejecutar la simulación en caso de que el cliente ejecute a alguien más, su simulación es una trampa, en cuyo caso el servidor siempre puede hacer la simulación final si todos los clientes informan algo extraño .
Lennard Fonteijn
1

Tu juego es para un jugador, la única "interacción" con los otros jugadores es un líder. Puede generar una instancia para verificar una simulación en su servidor para cada envío, no necesita todos los trucos para asegurarse de que la física sea la misma en más de 30 clientes, por lo que no creo que necesite más recursos de los que ya tiene desde la física ya está funcionando :).

Verificar cada resultado será un poco exagerado, podría enviar la simulación comprimida al servidor cada vez que alguien envíe un puntaje a la tabla de líderes, luego solo verifique los puntajes del 5% superiores en su propio servidor, o tal vez incluso el 1% superior o incluso más inteligente solo verifica nuevos puntajes altos y asume que todos los que no son mejores que el # 1 probablemente tengan una simulación no engañada.

No sé si su simulación es como, configurar y no interactuar (fácil de verificar) o si los jugadores pueden interactuar con el sim mientras se está ejecutando, pero asegúrese de hacer su física de tal manera que flote diferente las representaciones de puntos no arruinan las cosas y hacen que una ejecución válida parezca inválida.

Roy T.
fuente
No quiero entrar en detalles del juego en sí, pero puedes comparar mi juego con el juego de dardos: una vez que apuntaste y lanzaste, la física se hace cargo y no hay nada que puedas cambiar al respecto nunca más. ¿Este conocimiento cambiaría tu respuesta?
Lennard Fonteijn
No, no cambiaría nada :). Simplemente guarde las repeticiones en el servidor y solo verifique las sospechosas (por ejemplo, nuevas puntuaciones altas)
Roy T.
1

No lo hagas, te puedo asegurar que simular la física únicamente en el servidor es una muy mala idea. El principal problema no es la carga del servidor, sino la capacidad de respuesta. La capacidad de respuesta del cliente será increíblemente pobre. El jugador presionará un botón, luego tendrá que hacer un viaje de ida y vuelta al servidor antes de obtener los resultados de la simulación. He hecho variaciones de esto en el pasado (principalmente solo presionando botones), y los resultados no son bonitos y solo deben hacerse para juegos muy lentos que tienen alguna posibilidad de salirse con la suya (e incluso en esos casos la percepción la falta de capacidad de respuesta es un gran problema).

Un plan mejor que he tenido la intención de probar la próxima vez que se presente este tipo de escenario es elegir a los jugadores un subconjunto muy pequeño de su base de jugadores, luego simular para ellos el lado del servidor por un corto tiempo y comparar sus resultados con los de ellos, sin su conocimiento Si se están desviando demasiado (debe esperar algunos grados de divergencia), entonces los clasifica como posibles tramposos y continúa simulando durante un tiempo más para confirmar. Lo que obtendrá es una especie de curva en la medida en que un jugador legítimo diverge en comparación con el servidor, influenciado por las condiciones de la red, etc., y verá rápidamente que los tramposos están fuera de esta curva. Este sistema tiene los siguientes beneficios:

  • Automatizado
  • No sacrificas la capacidad de respuesta
  • Como solo simula un subconjunto muy pequeño de su base de jugadores, la carga será manejable e incluso escalable (tal vez elija menos jugadores para simular si la carga es alta)
  • Aplicable a todos los juegos que se me ocurren, tan altamente reutilizables
Ylisar
fuente
Entonces, como Roy, básicamente dices: mantenlo en el lado del cliente, almacena las "repeticiones" cuando los clientes envían una puntuación y solo valida esas repeticiones de vez en cuando (no todas, un pequeño porcentaje). ¿Qué sucede si, en función de la puntuación, el cliente envía un pago de crédito, la parte de progresión del jugador, los créditos también se pueden comprar con dinero real (!!!), ¿todavía recomienda este enfoque? Si hacer trampa da cantidades excesivas de créditos y solo valido de vez en cuando, básicamente perdería dinero. Probablemente puede marcar a una persona cuando su puntaje está por encima de un cierto umbral, pero ¿habría una mejor manera?
Lennard Fonteijn
Si el motor de física es determinista (debería serlo) y el servidor simula usar el mismo estado de inicio y las mismas entradas que el cliente (que debería ser factible), entonces los resultados deberían estar dentro de los límites razonables de error de coma flotante (insignificante). Incluso si hay efectos aleatorios, y no es factible pasar por alto el estado RNG, puede pasar los números aleatorios y usarlos para verificar (e incluso verificar su distribución, en caso de que la falsificación de rollos aleatorios haga una gran diferencia en el juego) .
Ipeet
Unos créditos están involucrados, será mejor que revises cada repetición ya que el engaño ya no es para estar en la cima de la lista de mejores puntuaciones sino para obtener dinero. Desea mucha más seguridad si hay dinero involucrado, no puedo ayudarlo allí.
Roy T.
@RoyT. Probablemente lo haré de todos modos, incluso si no pago dinero basado en créditos (¿alguien lo interpretó mal, supongo?). Tengo la intención de tener una política de tolerancia cero, por lo que solo agrego el archivo de reproducción para la validación. Si es realmente sospechoso, tomo medidas.
Lennard Fonteijn
1

Como dijo Daniel, el gran problema aquí serán los programas que realizan la acción para el jugador; no sería necesario sesgar la física en el juego si el jugador tuviera un brazo robótico con precisión normalmente resuelta para neurocirugía.

Algún chico
fuente
Podría haber sido un poco confuso. Mis juegos te otorgarán créditos virtuales después de que hayas completado un juego. Puede usar estos créditos para desbloquear contenido nuevo para jugar. También puede usar dinero real para comprar créditos para desbloquear contenido más rápido (tenga en cuenta que no es Pay2Win, odio eso). No tengo intenciones de pagar dinero real basado en créditos. Dicho esto, los dardos fueron solo una metáfora para describir cuánta influencia tiene un jugador en el estado de los cuerpos rígidos, no tengo miedo de los "aimbots", ya que eso te dará 0 ventajas.
Lennard Fonteijn