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?
fuente
Respuestas:
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.
fuente
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.
fuente
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:
fuente
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.
fuente