(Unidad) Solución de red optimizada para muchos objetos en movimiento.

8

Actualmente estoy emprendiendo un proyecto bastante ambicioso. En resumen, es un juego de estrategia multijugador en tiempo real que tiene mecánica de bacterias.

Esencialmente, tengo dos jugadores remotos en el entorno, y pueden generar unidades similares a bacterias que se atacan entre sí y se multiplican, duplicándose hasta que se alcanza un límite de recursos. A menudo, esto genera más de 200 objetos de juego en la pantalla, cada uno con su propio estado y movimiento. Esto suena mal, pero la jugabilidad local contra un bot es realmente muy buena, y he logrado que sea bastante eficiente.

Sin embargo, el problema surge cuando intento conectar en red este juego. Ya he intentado seguir esta guía para implementar esta función: http://www.paladinstudios.com/2013/07/10/how-to-create-an-online-multiplayer-game-with-unity/

Esto produce una experiencia de juego bastante lenta y desagradable, incluso con la mejor latencia. Esto es probablemente causado por tener que transmitir datos de movimiento para cientos de unidades.

La pregunta que estoy planteando:

¿Cómo puedo optimizar la conexión en red y la sincronización de muchas unidades móviles entre dos clientes?

Ya he pensado en una forma de hacer esto. Después de engendrar una unidad, solo viajarán en una dirección hasta que golpeen algo, ¿tal vez pueda sincronizar solo cuando las unidades se generan y cuando interactúan con otro objeto? ¿Tendría esto mucho beneficio? ¿Cuál es la forma ideal de implementar esto?

Gracias de antemano por las respuestas!

Rachel Cabot
fuente
¿Es probable que un modelo de cerradura sea lo que necesito? clintonbrennan.com/2013/12/lockstep-implementation-in-unity3d
Rachel Cabot
Estoy detrás de un cortafuegos y no puedo acceder al ejemplo que vinculó, pero ¿ha intentado serializar solo los vectores de ID, posición y velocidad de cada cuadro? Dependiendo de lo inteligente que sea con el algoritmo de serialización, puede reducir la información de estado a 7 bytes por objeto. Si se asegura de que el cliente asume una identificación faltante de la actualización como una muerte, y otras nuevas como un engendro, no debería tener ningún problema.
Stephan

Respuestas:

1

Para más de 200 objetos en movimiento, definitivamente querrás hacer que tu juego sea el paso. Con el paso cerrado, surge la necesidad de determinismo, pero eso no debería ser demasiado difícil para las bacterias (que se pueden simular con colisiones círculo-círculo).

Si no le importa mi descarado autoenchufe y quiere un ejemplo con la lógica de red y simulación de un juego de bloqueo, vea este activo de forma gratuita: https://www.assetstore.unity3d.com/en/#!/ contenido / 36206 . Desafortunadamente, esa versión no incluye todo el código fuente, pero siéntase libre de hackearlo con mi bendición;). Aquí hay un video de una prueba temprana de DPhysics: https://www.youtube.com/watch?v=NEzOghxfMdU .

La esencia del bloqueo es sincronizar la entrada en lugar de la salida. Esto se debe a que con una simulación síncrona, lo único que todos los clientes no saben son las entradas de otros clientes. El artículo que vinculó en su comentario lo explica bastante bien. No estoy seguro de cuán en profundidad desea que le explique el paso a paso, así que lo cortaré aquí y ampliaré esta respuesta si tiene más preguntas.

Actualización: piense en él como un servidor autorizado, excepto que el servidor envía información en lugar del estado del juego. Dado que cada jugador puede producir el estado del juego para sí mismo a partir de la entrada, no hay necesidad de que el servidor distribuya el estado del juego.

JPtheK9
fuente
1
Este enfoque puede llevar a la desincronización, incluso si todo es determinista, solo por la latencia entre las entradas que se comparten. Como ejemplo, tome un juego donde los jugadores intentan bloquear el movimiento de un objeto colocando paredes. En la pantalla de un jugador, podría haber cronometrado la ubicación correctamente y el objeto está bloqueado. Pero la replicación de eso al otro cliente puede llegar tarde, y una vez que se coloca la pared, el objeto ya ha pasado esa ubicación. Dependiendo de la mecánica de su juego, es posible que deba enviar periódicamente actualizaciones de "panorama general" para volver a sincronizar clientes.
Acidictadpole
Buen punto. Hay 0 posibilidades de desincronización si esto se hace correctamente. Si se pierde un paquete o llega muy tarde, el cliente no puede avanzar al siguiente cuadro; tendrá que esperar hasta que llegue el paquete para ejecutar el cuadro actual. Los marcos se pueden representar con enteros. El servidor distribuye paquetes marcados con un número entero para cada trama.
JPtheK9
Echa un vistazo a la lógica de redes y marcos por ti mismo.
JPtheK9
1
@ JPtheK9 "tendrá que esperar hasta que llegue el paquete para ejecutar la trama actual" ¿Y si el paquete nunca llega?
Stephan
Solicita uno nuevo.
JPtheK9