Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

[APORTE] Guia de como hacer tu propio sistema de red multijugador

Iniciado por Luxskkz, Octubre 06, 2018, 05:05:55 AM

Tema anterior - Siguiente tema
Octubre 06, 2018, 05:05:55 AM Ultima modificación: Octubre 06, 2018, 05:07:26 AM por Luxskkz
Hola a todos, acabo de subir el primer video de una serie de tutoriales que tengo pensado hacer en relación a como crear tu propio sistema de red multijugador enfocado a los MMORPG, espero que les interese y les agradecería que me dijeran si les gusta algo o le falta algo, cosas por el estilo con el fin de mejorar los próximos vídeos, Saludos.
 

" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen>
 
 

Octubre 06, 2018, 07:34:52 AM #1 Ultima modificación: Octubre 06, 2018, 07:36:01 AM por francoe1
Cita de: Luxskkz date=1538795155Hola a todos, acabo de subir el primer video de una serie de tutoriales que tengo pensado hacer en relación a como crear tu propio sistema de red multijugador enfocado a los MMORPG, espero que les interese y les agradecería que me dijeran si les gusta algo o le falta algo, cosas por el estilo con el fin de mejorar los próximos vídeos, Saludos.
   
   
      https://youtu.be/bldXaEUov_w
   
   
      
" width="560">
   
   
       
   


Quisiera ver como ese hermoso sockets stream tcp soporta los 5000 clientes ... 
 
Analicemos .. un MMO necesita sincronizar inputs, posición y estados del chunk donde el jugador se encuentre, pensemos que el jugador se encuentra en una zona donde hay 300 jugadores que deberían ser sincronizados, cada paquete de sincronización pesa en el mejor de los casos 200bytes, supongamos que el server se actualiza a 30FPS por lo que por cada cliente recibiría en 1 segundo 200 * 30 igual a 6Kbs aproximadamente, ahora supongamos que el socket del servidor recibe estos datos de los 5000 clientes conectados al server, estaría recibiendo 30MB por segundo, el socket que ejecuta el servidor está en modo STREAM por que irá leyendo bytes a bytes los 30MB que están en el buffer TCP - el mejor de los casos este proceso tarda 5 segundos, agregamos que el parseo de los paquetes y el análisis interno  de los datos agregue unos 10 segundos más a la ecuación, tendríamos un retraso entre TICK y TICK del proceso de 15 segundos....
 
No hace falta comentar que pasaría si intentas enviar los datos de 300 clientes a cada cliente este seria como 30MB * 5000 Clientes por lo que el servidor tendría que tener una velocidad de subida de 150.000Mbits lo cual veo poco probable.
 
No intentó desanimar, pero no esta bueno que intentes engañar a la gente, el desarrollo de un servidor para juegos tiene muchisimas complicaciones, por lo que lo lógico sería empezar por explicar los conceptos básicos. un IPEndPoint no representa una conexión, este es un objeto que contiene la información de una conexión. Jamás bajo ningún concepto se debería utiliza un socket stream para enviar datos como posición ya que este crearía un cuello de botella insostenible, los Sockets TCP envian Byte a Byte y analizan que cada uno llegue, por lo que por cada bytes tenes 3 ACK esto aumenta el tamaño de cada paquete en un 300% siempre y cuando el byte enviado llegue, si el mismo no llega entonces se repetirá el proceso bytes-> <-ACK -> ACK <-ACK ...
 
Este análisis solo se trata del consumo a nivel de red, pero a nivel programación estas creando un AsyncCallback por cada conexión y supongo igual por cada cliente utilizaras un AsyncCallback para la recepción de paquetes.
 
¿Cómo controlas de esta manera la frecuencia de actualización del servidor, es decir, el servidor se ejecutaría en tiempos dominados por la recepción de paquetes?
 
¿Cuantas veces pasaria el GC al crear tantos AsyncCallbacks?
 
Desde mi punto de vista estas en los inicios de un mundo que tiene mucho que explorar, esta bueno que intentes compartir tus conocimientos pero intenta ser realista, este tipo de servidores podría servidor para un ajedrez donde uno de los clientes es servidor y el otro se conecta. ¿Pero para un MMO de 5000 CCU? ni siquiera aguanta las conexiones de manera estable - 

Cita de: francoe1 date=1538804092Quisiera ver como ese hermoso sockets stream tcp soporta los 5000 clientes ... 
   
   
      Analicemos .. un MMO necesita sincronizar inputs, posición y estados del chunk donde el jugador se encuentre, pensemos que el jugador se encuentra en una zona donde hay 300 jugadores que deberían ser sincronizados, cada paquete de sincronización pesa en el mejor de los casos 200bytes, supongamos que el server se actualiza a 30FPS por lo que por cada cliente recibiría en 1 segundo 200 * 30 igual a 6Kbs aproximadamente, ahora supongamos que el socket del servidor recibe estos datos de los 5000 clientes conectados al server, estaría recibiendo 30MB por segundo, el socket que ejecuta el servidor está en modo STREAM por que irá leyendo bytes a bytes los 30MB que están en el buffer TCP - el mejor de los casos este proceso tarda 5 segundos, agregamos que el parseo de los paquetes y el análisis interno  de los datos agregue unos 10 segundos más a la ecuación, tendríamos un retraso entre TICK y TICK del proceso de 15 segundos....
   
   
      No hace falta comentar que pasaría si intentas enviar los datos de 300 clientes a cada cliente este seria como 30MB * 5000 Clientes por lo que el servidor tendría que tener una velocidad de subida de 150.000Mbits lo cual veo poco probable.
   
   
      No intentó desanimar, pero no esta bueno que intentes engañar a la gente, el desarrollo de un servidor para juegos tiene muchisimas complicaciones, por lo que lo lógico sería empezar por explicar los conceptos básicos. un IPEndPoint no representa una conexión, este es un objeto que contiene la información de una conexión. Jamás bajo ningún concepto se debería utiliza un socket stream para enviar datos como posición ya que este crearía un cuello de botella insostenible, los Sockets TCP envian Byte a Byte y analizan que cada uno llegue, por lo que por cada bytes tenes 3 ACK esto aumenta el tamaño de cada paquete en un 300% siempre y cuando el byte enviado llegue, si el mismo no llega entonces se repetirá el proceso bytes-> <-ACK -> ACK <-ACK ...
   
   
      Este análisis solo se trata del consumo a nivel de red, pero a nivel programación estas creando un AsyncCallback por cada conexión y supongo igual por cada cliente utilizaras un AsyncCallback para la recepción de paquetes.
   
   
      ¿Cómo controlas de esta manera la frecuencia de actualización del servidor, es decir, el servidor se ejecutaría en tiempos dominados por la recepción de paquetes?
   
   
      ¿Cuantas veces pasaria el GC al crear tantos AsyncCallbacks?
   
   
      Desde mi punto de vista estas en los inicios de un mundo que tiene mucho que explorar, esta bueno que intentes compartir tus conocimientos pero intenta ser realista, este tipo de servidores podría servidor para un ajedrez donde uno de los clientes es servidor y el otro se conecta. ¿Pero para un MMO de 5000 CCU? ni siquiera aguanta las conexiones de manera estable - 
   


Hola, comprendo lo que dices pero el colocar 5000 como un numero es simplemente un ejemplo, es para mostrar mas que nada como hacer un servidor personalizado el tutorial, esta enfocado para aquellos que prefieren algo mas expandible o modificable que UNET O PHOTON o servicios similares, desde un punto de vista de los juegos MMO(ya sea integrando Barras de vida, exp, ataques, sincronizar movimiento), es obvio que para hacer un servidor para 5000 jugadores o siquiera para hacer un servidor de 100 jugadores se necesita HARDWARE especializado para eso.
 
Saludos.

Cita de: Luxskkz date=1538853583Hola, comprendo lo que dices pero el colocar 5000 como un numero es simplemente un ejemplo, es para mostrar mas que nada como hacer un servidor personalizado el tutorial, esta enfocado para aquellos que prefieren algo mas expandible o modificable que UNET O PHOTON o servicios similares, desde un punto de vista de los juegos MMO(ya sea integrando Barras de vida, exp, ataques, sincronizar movimiento), es obvio que para hacer un servidor para 5000 jugadores o siquiera para hacer un servidor de 100 jugadores se necesita HARDWARE especializado para eso.
   
   
      Saludos.
   


No, no es un problema de hardware, servers como Lineague, MU, y otros tantos MMO que soportan bastantes jugadores lo haciendo en equipos equivalentes a Intel pentium 4 dual Core con 4gb de RAM. 
 
Para cualquier servidor de juegos se requiere una implementación UDP, y una estructura planificada para el sistema.
 
Existen artículos de Valve donde explican muy bien temas como ACK, TickRates interpolación de movimiento etc. Ya te lo dije, estás empezando a conocer el networking aún falta mucho camino para empezar con un tutorial. 

Etiquetas: