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
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 -
