usados usado tipos programas programar programacion para mejores mejor mas lenguajes lenguaje cual c# java python networking

c# - usado - mejores programas para programar



Buen lenguaje para desarrollar un servidor de juegos? (15)

¿Qué tipo de rendimiento necesitas?

twisted es ideal para servidores que necesitan mucha concurrencia, como lo es erlang. O admite simultaneidad masiva fácilmente y tiene instalaciones para informática distribuida.

Si desea abarcar más de un núcleo en una aplicación de Python, haga lo mismo que haría si quisiera abarcar más de una máquina: ejecute más de un proceso.

Me preguntaba qué idioma sería una buena opción para desarrollar un servidor de juegos para admitir un gran número (miles) de usuarios. Incursioné en python, pero me di cuenta de que sería demasiado problema ya que no genera hilos en los núcleos (es decir, un servidor de 8 núcleos = 1 servidor central). Tampoco me gustó mucho el lenguaje (ese "yo" me asombró).

Sé que C ++ es el lenguaje para el trabajo en términos de rendimiento, pero lo odio. No quiero lidiar con su sintaxis descuidada y me gusta que mi mano esté en manos de los lenguajes administrados. Esto me lleva a C # y Java, pero estoy abierto a otros idiomas. Me encanta la simplicidad de .NET, pero me preguntaba si, en cuanto a la velocidad, esto sería bueno para el trabajo. Tenga en cuenta que esto se implementará en un servidor Linux, se estaría ejecutando en el marco de Mono, no estoy seguro si eso importa. Sé que Java es muy similar a la sintaxis de .Net, pero mi experiencia con él es limitada. ¿Hay marcos para eso o para facilitar el desarrollo?

Por favor, ayúdame a mí y a mi exigente a llegar a una solución.

ACTUALIZACIÓN: No quise parecer tan exigente, y realmente no creo que lo fuera. El único lenguaje que realmente excluí fue C ++, Python que no me gusta debido al problema de escalabilidad. Sé que hay formas de comunicación entre procesos, pero si tengo un servidor de 8 núcleos, ¿por qué debería hacer 8 procesos? ¿Hay una solución más elegante?



Hablando de rendimiento puro, si puede ejecutar Java 6 obtiene un rendimiento de 1: 1 en comparación con C ++ optimizado (a pesar de casos especiales, a veces Java es más rápido, a veces C ++), el único problema es, por supuesto, bibliotecas de bases de datos , interconectividad, escalabilidad y tal. Creo que hay una variedad de buenas a excelentes soluciones disponibles para cada uno de estos problemas, pero no encontrarás un lenguaje que lo resuelva todo por ti, así que tengo que darte el consejo ancestral: elige el idioma que te gusta y usa ese. .

Oh, todavía estás leyendo esto? :) Bueno, aquí hay algunos indicadores adicionales.

  • EVE Online utiliza Python para su código de cliente y servidor, y está tan lleno de errores y laggy como algo que no creo que deba escribir aquí, así que sería un ejemplo de cómo se puede extender Python (pobremente) para servir grandes cantidades de usuarios.
  • Si bien Java tiene algunas soluciones buenas a excelentes para varios problemas relacionados, en realidad no es el mejor idioma para una gran cantidad de usuarios; no escala bien a los extremos sin sintonía. Sin embargo, hay soluciones multi-VM para esto que solucionan el problema, por ejemplo, se dice que Terracotta hace bien el trabajo.
  • Si bien C ++ es bastante engorroso, permite una interacción de bajo nivel con el sistema, por lo que es posible que realmente te encuentres haciendo cosas que creías que no podías hacer. Estoy pensando en algo así como un microclustering dinámico por núcleo de bloques de código de tiempo de ejecución para "llenar" cada ciclo de reloj posible del procesador de la manera más eficiente posible para un rendimiento máximo y cosas por el estilo.
  • Mono está muy por detrás de la VM de .NET / equivalente en las plataformas de Windows, por lo que no podría usar las características más recientes y atractivas de C #. Sin embargo, las licencias de OEM de Windows XP (x64) son tan ridículamente baratas en este momento que con una pequeña inversión podría obtener un montón de ellas y luego podría ejecutar su código en la plataforma que estaba destinado a ser. Y no caigas en la exageración de Linux, Linux es tu salvador solo si realmente sabes cómo usarlo y especialmente XP es bastante rápido y estable hoy en día.

Los candidatos obvios son Java y Erlang:

Pro Java:

  • facilidad de desarrollo
  • buenos entornos de desarrollo
  • estabilidad, buenos rastros de pila
  • conocido (programadores experimentados fáciles de encontrar, muchas bibliotecas, libros, ...)
  • VM bastante rápido y maduro

Pro Erlang:

  • probado en sistemas que necesitan> 99.9% de tiempo de actividad
  • capacidad de tener actualizaciones de software sin tiempo de inactividad
  • escalable (no solo multi-core, sino también multi-máquina)

Contra Erlang:

  • sintaxis desconocida y paradigma de programación
  • no tan bien conocido; Es difícil conseguir programadores experimentados para
  • VM no es tan rápido como Java

Si su servidor de juegos funciona principalmente como un despachador de eventos (con un poco de una base de datos remetida), el paradigma impulsado por mensajes de Erlang debería ser una buena combinación.

En este día y edad, no consideraría usar un lenguaje no administrado (como C o C ++); los beneficios de rendimiento marginal simplemente no valen la molestia.


Más detalles sobre este servidor de juego podrían ayudar a la gente a responder mejor a su pregunta. ¿Es este un servidor de juego en el sentido de algo así como un servidor dedicado Counter Strike que se encuentra en segundo plano y alberga interacciones multijugador o estás escribiendo algo que se alojará en un servidor web HTTP?

Personalmente, si fuera yo, estaría considerando Java o C ++. Mi preferencia personal y mi conjunto de habilidades probablemente me llevarían a C ++ porque me parece difícil trabajar con Java en ambas plataformas (más aún en Linux) y aún no tengo la confianza de que C # esté listo para el horario de máxima audiencia en Linux.

Dicho esto, también es necesario que una comunidad bastante importante trabaje duro en dicho servidor antes de que el rendimiento de su idioma sea tan problemático. Mi consejo sería escribirlo en cualquier idioma que pueda en este momento y, si su juego alcanza el tamaño suficiente, invierta en una reescritura en ese momento.


Odio decirlo, y sé que estoy arriesgando un mod down aquí, pero no parece que haya un lenguaje para ti. Todos los lenguajes de programación tienen sus peculiaridades y los programadores simplemente tienen que adaptarse a ellos. Es completamente posible escribir un servidor en funcionamiento en Python sin clases (eliminando las referencias de clase variable "auto") y también es tan fácil escribir C ++ con sintaxis limpia.

Si desea implementar plataformas multiplataforma y desea desarrollar plataformas cruzadas también, su mejor opción probablemente sea Java. Se trata de ciclos de desarrollo más cortos que los lenguajes compilados como C y C ++, pero es de mayor rendimiento (discutible, pero siempre he sido anti-Java = P) que los lenguajes interpretados como Python y Perl y no tienes que trabajar con implementaciones no oficiales como Mono que de vez en cuando no admite todas las funciones de un idioma.


Podrías echar un vistazo a Stackless Python . Es un intérprete de Python alternativo que proporciona un mayor soporte para la concurrencia. Tanto el servidor de EVE Online como el software cliente usan Stackless Python.

Descargo de responsabilidad: Yo no he usado Stackless Python extensivamente yo mismo, así que no puedo proporcionar ninguna cuenta de primera mano de su eficacia.


Puede depender mucho del idioma en el que se exprese mejor su "lógica de juego" (es posible que conozca este término como "lógica de negocios"). Por ejemplo, si la lógica del juego se expresa mejor en Python (o en cualquier otro idioma), podría ser mejor escribirlo en Python y tratar los problemas de rendimiento de la manera más difícil con multi-threading o clustering. Aunque te puede costar mucho tiempo obtener el rendimiento que deseas de Python, será menos que el tiempo que te lleve expresar que "el jugador A ahora lanza un hechizo de oscuridad de nivel 70 en el radio de 7 unidades efectuando todas las unidades que han hablado con el jugador B y .... "en C ++.

Otra cosa a considerar es qué protocolo usará para comunicarse con los clientes. Si tiene un protocolo binario complejo, C ++ puede ser más fácil (especialmente si ya tenía experiencia haciéndolo antes) mientras que un JSON (o similar) puede ser más fácil de analizar en Python. Sí, sé que C ++ y python no son idiomas a los que estás limitado (o incluso considerado), pero aquí me refiero a ellos en general.

Probablemente se reduce a en qué idioma eres mejor. Un programa mal escrito que odiaste escribir será peor que uno escrito en un idioma que conoces y disfrutas, incluso si el programa mal escrito fue en un lenguaje discutible más poderoso.


También podría usar Java y compilar el código usando GCC en un ejecutable nativo.

De esa forma no obtendrás el golpe de rendimiento del motor de bytecode (Sí, lo sé, Java fuera de la caja es tan rápido como C ++. Debe ser solo yo quien siempre mide una diferencia de rendimiento de factor 5). El inconveniente es que GCC Java-frontend no es compatible con todas las características del lenguaje Java 1.6.

Otra opción sería usar el idioma de su elección, obtener el código que funcione primero y luego mover el material crítico de rendimiento al código nativo. Casi todos los idiomas admiten enlaces a bibliotecas compiladas.

Eso no resuelve tu problema de "python no multihilo bien", pero te da más opciones.


También puedes mirar jRuby . Viene con muchos de los beneficios de Java y muchos de los beneficios de Ruby en un paquete ordenado. Tendrás acceso a enormes bibliotecas de ambos idiomas.


Hay un marco muy bueno en desarrollo que aborda todas sus necesidades:

Proyecto Darkstar de Sun. Así que diría que Java parece ser un buen lenguaje para el desarrollo de servidores de juegos :-)


Sé que Facebook usa una combinación de Erlang y C ++ para su motor de chat.

Independientemente de lo que decida, si elige una combinación de idiomas, consulte el marco de ahorro de Facebook para la implementación de servicios de idiomas cruzados. Lo abrieron desde hace un año o más:

http://incubator.apache.org/thrift/


¿Cuáles son tus objetivos? No es la creación del juego en sí, pero ¿por qué lo estás creando?

Si lo hace para aprender un nuevo idioma, elija el que le parezca más interesante (es decir, el que más desea aprender).

Si es por cualquier otro motivo, entonces el mejor idioma será el que mejor conozca y disfrute al máximo. Esto le permitirá concentrarse en la lógica del juego y poner en marcha algo para que pueda ver el progreso y mantenerse motivado para continuar, en lugar de atascarse en los detalles del idioma que está utilizando y perder interés.

Si su idioma favorito resulta inadecuado de alguna manera (demasiado lento, no lo suficientemente expresivo, lo que sea), puede volver a escribir las secciones problemáticas en un idioma más adecuado cuando surjan problemas, y no sabrá cuál es el mejor idioma para abordar el tema específico problemas hasta que sepa cuáles son los problemas. Incluso si el idioma elegido resulta totalmente inadecuado para el uso final de la producción y todo tiene que ser reescrito, le dará un prototipo funcional con una lógica de juego probada, lo que facilitará enormemente el manejo del nuevo idioma.


Puede que me esté yendo un poco fuera de tema aquí, pero el tema me interesa ya que (hobby-wise) funcionó en bastantes servidores de juegos (servidores MMORPG), tanto en el código de otros como en el mío. Hay literatura que te interesará, envíame una nota si quieres algunas referencias.

Una cosa que me llama la atención en su pregunta es la de querer atender a miles de usuarios de una aplicación multiproceso. Desde mi humilde experiencia, eso no funciona demasiado bien. :-)

Cuando presta servicios a miles de usuarios, desea un diseño que sea lo más modular posible, ya que uno de sus objetivos principales será mantener el servicio como un todo en funcionamiento. Los servidores de juego tienden a ser bastante complejos, por lo que habrá bastantes errores que detendrán los shows. No haga que su vida sea miserable con un único punto de falla (¡una aplicación!).

En cambio, intente crear múltiples procesos que puedan ejecutarse en una multitud de hosts. Mi humilde sugerencia es la siguiente:

  • Hágalos independientes, por lo que un proceso fallido será irrelevante para el servicio.
  • Hágalos pequeños, para que las diferentes partes del servicio y la forma en que interactúan sean fáciles de entender.
  • No permita que los usuarios se comuniquen directamente con gamelogic O DB. Escriba un proxy: las pilas de la red pueden y mostrarán un comportamiento extraño en diferentes arquitecturas cuando tenga una gran cantidad de usuarios. También asegúrese de que luego pueda "limpiar" / filtrar lo que los proxies envían.
  • Tenga un proceso que solo supervise otros procesos para ver si aún funcionan correctamente, con la posibilidad de reiniciar piezas.
  • Hazlos distribuibles. Coordine los procesos a través de TCP desde el principio o se encontrará con problemas de escalabilidad.
  • Si tiene paisajes grandes, considere la forma de dividir dinámicamente la carga dividiendo los servidores por geografía. No haga que todos los procesos de back-end contengan todos los datos en la memoria.

He portado algunos de esos motores escritos en C ++ y C # para hosts que operan en Linux, FreeBSD y también Solaris (en un UltraSparc IIi antiguo, sí, el mono todavía se ejecuta allí :). Desde mi experiencia, C # es bastante rápido, teniendo en cuenta qué hardware antiguo funciona en esa máquina Sparc.

La industria (hasta donde yo sé) tiende a usar mucho C ++ para el trabajo de servicio e incorpora lenguajes de scripting para la lógica del juego. Ah, ya escrito demasiado - buen tema.


C ++ y Java son bastante lentos comparados con C. El lenguaje debe ser una herramienta, pero no una muleta.