¿Es viable Java para el desarrollo serio de juegos? [cerrado]

64

He explorado Internet, pero no hay muchos recursos para el desarrollo de juegos Java, ni siquiera tantos como C ++. De hecho, la mayoría de los motores están escritos en C ++. Traté de jugar un juego hecho con jMonkeyEngine, pero el juego fue terriblemente lento, hasta el punto en que mi computadora se congeló. No tenía otras aplicaciones Java en ejecución, y nada de recursos intensivos. En contraste, mi computadora puede jugar juegos 3D más modernos con facilidad. Si sigo aprendiendo y mejorando Java ahora, y resulta que más tarde debo aprender C ++, hacer el cambio podría ser difícil.

¿Es Java un lenguaje aceptable para el desarrollo serio de juegos? Por serio, quiero decir gráficos de alta calidad, sin mucho retraso en las computadoras modernas. También quiero considerar hacer juegos para consolas.

tehtros
fuente
25
¿No es Minecraft construido con Java? O principalmente OpenGL? Ah, y echa un vistazo a C # si no estás 100% configurado en Java, ya que es increíble.
Aralox
77
¿Por qué no vienes al chat de Stack Overflow C ++? Nos encanta C ++, creemos que se puede usar absolutamente bien, y sabemos cómo hacerlo, y nos encantaría compartirlo.
DeadMG
12
Minecraft es habilidades de codificación de Java + LWJGL + Notch, por lo que en términos de rendimiento es TERRIBLE.
MLProgrammer-CiM
3
Ya sean sus juegos de codificación o cualquier otra cosa, encerrarse en un solo idioma no lo ayudará en el futuro. Se ramifica un poco, ya sea C ++ o algo más como Python. Lleva tiempo, pero te hace un mejor desarrollador.
loganfsmyth
44
Obtendrá mucha información errónea porque las guerras Java / C ++ arden brillantemente, prepárese para pedir ejemplos específicos antes de aceptar una opinión y también para investigar más por su cuenta =) Dicho esto, estoy de acuerdo con @loganfsmyth que necesitará saber muchos idiomas porque solo entonces puede elegir la herramienta adecuada para cualquier tarea. En el futuro inmediato, si solo quiere aprender "programación de estilo de juego", use lo que le resulte más cómodo (Java) y luego aprenda C ++ más tarde. Diablos, luego puedes estar haciendo canalizaciones de contenido en C # y juegos en Java ME, difícil de predecir =)
Patrick Hughes

Respuestas:

54

Sí, consulte esta lista para obtener una prueba. Esos son algunos juegos hechos con Java usando The Lightweight Java Game Library (LWJGL). Es un marco de bajo nivel, que proporciona OpenGL para gráficos de alta calidad y OpenAL para sonidos. También proporciona API de entrada. Con estos, puedes comenzar fácilmente a desarrollar juegos serios en Java.

Actualmente estoy escribiendo mi segundo juego 3D como un proyecto de hobby en Java, y me encanta. En el pasado solía escribir mis juegos con C ++, pero después de cambiar a Java no hay vuelta atrás. El soporte de múltiples sistemas operativos con Java puede ser muy fácil, por ejemplo, mi juego Java anterior, que desarrollé en Windows durante un año, funcionó en Linux de inmediato y en OS X con un solo error sin necesidad de compilar nada en esas plataformas.

Por otro lado, con Java tienes un par de problemas.

  1. Recolector de basura. Como han dicho otros, la gestión de memoria no determinista es un problema, y ​​debe tener esto en cuenta.
  2. Falta de bibliotecas de terceros. La mayoría de las bibliotecas disponibles no son compatibles con Java. Por otro lado, siempre tiene la opción de llamar a estas bibliotecas nativas desde Java también, pero es más trabajo hacerlo. También hay puertos Java o envoltorios listos para usar disponibles para bibliotecas populares, por ejemplo, estoy usando JBullet - puerto Java de Bullet Physics Library . Por otro lado, Java tiene una biblioteca de clase enorme incorporada, lo que reduce la necesidad de bibliotecas de terceros que no están relacionadas con el juego. La falta de bibliotecas no ha sido un problema para mí, pero puedo imaginar que puede serlo para otros.
  3. Java no es compatible con las consolas de juegos populares y, por lo que sé, no hay un cambio fácil a los de Java. Por otro lado, Android, que es una plataforma móvil popular, usa alguna forma de Java. Esta es también una opción, pero no excepto el mismo código Java para trabajar tanto en una PC como en un dispositivo Android.
  4. Comunidad más pequeña. La mayoría de los programadores de juegos usan C ++ y, en mi experiencia, a menudo no les gusta Java. No esperes recibir tanta ayuda de los demás. No esperes conseguir un trabajo en el desarrollo de juegos sin habilidades de C ++.
msell
fuente
40

Realmente no. Aquí está la cosa: en primer lugar, hay muy poco en términos de bibliotecas existentes para Java en comparación con prácticamente todo lo que es para C ++.

En segundo lugar, Java como lenguaje simplemente no se presta bien para el desarrollo de juegos; quiero decir, por ejemplo, si se trata de buffers de GPU, Java no proporciona una función de lenguaje que lo ayudará a garantizar que estén correctamente bloqueados y desbloqueado o eliminado, lo que hace C ++. Además, está el problema del rendimiento, y el GC no es determinista, lo que es súper malo para un juego.

Nunca he observado ningún juego no independiente que haya pasado mucho tiempo en un lenguaje que no fue compilado en código nativo antes de la ejecución, e incluso los juegos independientes que lo hacen son una rareza. Así que mi creencia en este momento es que simplemente no se puede hacer.

Además, si continúo aprendiendo y mejorando Java ahora, y resulta que más tarde debo aprender C ++, ¿será difícil hacer el cambio?

Sí, absolutamente lo hará. Java y C ++ son muy diferentes, a pesar de sus similitudes sintácticas superficiales. La experiencia en Java no cuenta prácticamente para nada cuando se aprende C ++.

El juego sobre los gráficos es una opción viable, y puedes verlo en el éxito de juegos como Terarria y Minecraft. Pero si tiene la intención de crear gráficos srs, entonces no será factible en Java.

DeadMG
fuente
66
+1 ya que especificó gráficos pesados, juego rápido sin retraso.
Joshua Drake
1
La falta de tipos de datos sin firmar de Java también se opone. Sí, puede solucionarlo, pero no es ideal y usará código que realmente no refleja los datos subyacentes correctamente.
Maximus Minimus
@deadmg En caso de bloqueo y desbloqueo , ¿se refiere a alguna funcionalidad de la API de DirectX? ¿Me puede decir qué tiene de malo tener GC no determinista?
Quazi Irfan
El GC no determinista puede equivaler a soltar cuadros, si se detiene mal, el mundo hace una pausa y bloquea las cosas por más tiempo del necesario para renderizar el cuadro. En la práctica, esto realmente no sucede a menudo / nunca si planifica el uso de su memoria, los colectores de JVM pueden configurarse para una pausa baja (dentro de los límites seguros para la caída de cuadros). Aún así, no es algo divertido tener que lidiar. Termina teniendo que devolver cantidades significativas de la productividad que ganó cuando dejó C ++.
Michael
2
Un comienzo que tendrá que reescribir totalmente.
DeadMG
25

Entonces, realmente me tomo en serio el desarrollo de juegos, ¿Java sigue siendo una opción viable? He intentado varias veces aprender C ++, pero realmente no me gusta el lenguaje. Realmente no sé por qué, pero generalmente, cuando trato de aprender, nunca puedo entender los temas.

Si su razón para elegir Java es que no puede entender C ++, sus programas Java no serán lo suficientemente rápidos para gráficos de alta calidad. El uso de un lenguaje de nivel superior debe ser porque te hace más productivo, no porque no puedas entender el lenguaje de nivel inferior.

No creo que sea una mala idea escribir un juego en Java, especialmente si el juego es simple, pero inmediatamente tendrás problemas de rendimiento en Java si lo usas como una muleta.

Entonces, en resumen, ¿se puede tomar a Java en serio para un desarrollo de juego serio? ¿Esto incluye gráficos pesados, un juego rápido sin retraso y, posiblemente, y un cambio fácil a las consolas?

  1. Gráficos pesados: posible, pero va a hacer lo mismo en Java / LWJGL que en C ++ / GL: escribir bytes en buffers de GPU y / o usar las listas de visualización obsoletas como lo hace Minecraft. Si no comprende la gestión de la memoria, tampoco lo hará correctamente.

  2. Juego rápido sin retraso: no es una tarea fácil en ningún idioma, y ​​es más probable que te dispares en el pie de cualquier manera sin pensarlo.

  3. No, Java no estará disponible en consolas.

Palanqueta
fuente
Como pregunta secundaria, ¿qué reemplazó las listas de visualización cuando quedaron en desuso?
Suds
@Suds: canalización programable, creo.
DeadMG
¡decir ah! Ya lo cubrí. VBO: gamedev.stackexchange.com/questions/22170/…
Jimmy
Las plataformas móviles podrían considerarse consolas. Me doy cuenta de que probablemente estaba hablando de los tres grandes, pero Android usa Java y se crean muchos juegos para ello.
Amplify91
1
@ Amplify91 sí, algunos juegos están escritos en Java para Android. Pero la mayoría de los juegos buenos y probablemente todos los juegos de gráficos intensivos o multiplataforma están escritos en C ++ usando el NDK de Android.
Coyote
15

Un programador experimentado generalmente conocerá muchos lenguajes de programación: aprender lenguajes de programación adicionales no es demasiado difícil una vez que conoce uno bien. Sin embargo, recomendaría encarecidamente que C ++ no sea su primer idioma, y ​​probablemente tampoco el segundo.

Esto se debe a que C ++ obtiene gran parte de su eficiencia al no realizar ninguna verificación significativa de errores de tiempo de ejecución. Por ejemplo, acceder a un elemento al final de una matriz en Java siempre generará una excepción que le indica al programador exactamente qué está mal. En C ++ puede tener suerte y se bloqueará de inmediato, pero con mucha frecuencia desechará silenciosamente otros datos y el error no aparecerá hasta mucho más tarde .

Te sugiero que te quedes con Java por ahora (o cambia a C # si lo prefieres). Eso le permitirá hacer las cosas más rápido que usar C ++, y el rendimiento en una PC no debería ser un problema.

Piense en aprender C ++ después de haber completado algunos proyectos en lenguajes más seguros. C ++ es lo que necesitará para la mayoría de los trabajos profesionales de desarrollo de juegos.

Tenga en cuenta que, con la excepción de que C # / XNA obtenga un juego que escribió en una consola como mínimo, debe establecer una empresa, una oficina y tener un gran presupuesto disponible para hardware de desarrollo y otros gastos.

Adán
fuente
Esto también es excepcionalmente cierto porque otros lenguajes más allá de C ++ te darán una sensación de logro. C ++ puede tomar cientos de horas para lo que puede parecer nada. Aprender otros idiomas primero te permite mojarte los pies.
Darkenor
Sus comentarios sobre la falta de manejo de errores son realmente sobre C (y el llamado código C ++ que realmente es C). C ++ tiene bibliotecas estándar (y bibliotecas de plantillas estándar) que tienen un manejo de errores mucho mejor que el que usted describe. C ++ también tiene bibliotecas proporcionadas por el proveedor (como MFC) que proporcionan un manejo de errores decente.
Jasper
9

Descargo de responsabilidad: esto no responde exactamente a su pregunta. Sin embargo, he intentado (brevemente) mencionar algunos puntos que pueden ser de su interés.

La razón por la que ve tanto sobre C ++ es porque C ++ sigue siendo el estándar de la industria: el lenguaje más común para consolas, etc.

Java no se usa con frecuencia. Minecraft es un juego bastante popular que lo hizo grande con Java; pero no es tan bueno gráficamente. Spiral Knights no es malo, también está hecho en Java, con gráficos significativos.

Si le gusta Java, C # es muy similar en sintaxis, con la ventaja de que puede interoperar con C ++, por lo que se pueden hacer cosas de bajo nivel en C ++ si es necesario. Unity puede usar C # para secuencias de comandos, y XNA es una excelente opción.

Nuevamente, Java no se usa ampliamente. Si le gusta el estilo y la sintaxis, creo que encontrará que C # es una experiencia de codificación muy similar y muy agradable.

Espero que tus sueños se hagan realidad, es muy divertido en el camino :)

cenizas999
fuente
8
Montones y montones de imprecisiones en estas publicaciones. Los gráficos "malos" de Minecraft no están (fuertemente) relacionados con el lenguaje. El mal rendimiento de MC está directamente relacionado con que Java sea un mal lenguaje para los juegos debido a enormes problemas de rendimiento, y LWJGL es una biblioteca inadecuada para grandes proyectos de codificación por la misma razón. Pero el factor más importante fue la mala codificación e implementación de Notch, que se está solucionando ... lentamente. C # le ofrece todas las ventajas de la memoria administrada sin la mayoría de los problemas de rendimiento de Java. La desventaja es que C # está fuertemente centrado en Microsoft tanto para juegos como para aplicaciones.
MLProgrammer-CiM
2
@EfEs: Odio decírtelo, pero la memoria administrada es terrible para los juegos, y las personas que codifican juegos en XNA tienen que pasar más tiempo administrando la memoria que las personas que codifican en C ++. La naturaleza no determinista de la GC significa que tiene que agrupar prácticamente todo y evitar la asignación como la peste, no la forma en que se suponía que debía usarse el lenguaje.
DeadMG
Esta respuesta no estaba destinada a ser 100% precisa; Solo cité ejemplos que conozco vagamente. Siéntase libre de DV.
cenizas999
2
@DeadMG Sé que C ++ es el camino a seguir, solo estaba tratando de explicar que C # es mejor que Java para juegos.
MLProgrammer-CiM
55
Siendo un desarrollador de C # desde hace mucho tiempo (no creía el desarrollador de juegos), creo que la agrupación y la administración de memoria son grandes problemas para cualquier sistema mal diseñado. Las personas con la mentalidad C / C ++ y las formas de desarrollo que conozco, apenas se quedan sin aliento en la memoria administrada, los patrones de diseño y arquitectura que deben usarse y los aprovechan en un lenguaje como Java / C #. Lo que estoy tratando de decir no es que las técnicas o productos C / C ++ sean malos, sino que incluso si usas lenguajes más simples en términos de sintaxis (como Java y C #), aún necesitas mucha experiencia para diseñar tu juego correctamente camino.
Ivaylo Slavov
3

Esto no responde tu pregunta; los problemas de gráficos y consola parecen ser algo que debes considerar. También la GC afecta el rendimiento. Pero de lo que escribo:

Si está escribiendo programas OO grandes y complejos, los escribirá 5 veces más rápido en Java que C ++. Además, el mantenimiento será mucho más fácil. Cambié, (ciertamente para software que no es de juegos), y mi productividad se disparó. C #, otra buena alternativa, es más difícil de aprender que Java porque hay mucho más. Cuando lo sepa, puede escribir código incluso más rápido que en Java; te ofrece muchos trucos. Sin embargo, creo que esos trucos pueden dificultar el mantenimiento. Y luego está el documento de Java, que ayuda con las bibliotecas de Sun y su propio código antiguo. C # no tiene nada parecido.

Hice un gran juego peludo en Java y encontré el lenguaje perfecto, pero mis gráficos eran elementales y no era un juego de disparos donde una décima de segundo era una eternidad para los jugadores. Además, espero agregarle mucho más tarde, mientras que creo que la mayoría de la gente simplemente va y escribe un juego completamente nuevo.

RalphChapin
fuente
3

Mira amigo, la respuesta simple a "¿Es Java viable para el desarrollador de juegos" es un obvio sí. Puedes usar cualquier lenguaje de programación para hacer juegos. Eso no significa que debas .

Probablemente, las mismas cosas que lo apagan de C ++ (administración de memoria de bajo nivel, sin recolector de basura, tener que prestar atención a los punteros, estructuras como matrices, etc.) son las mismas cosas que debe aprender si desea explotar los recursos de una computadora de manera más eficiente . Tus juegos funcionarán mejor si estás explotando los recursos de la computadora de manera más eficiente.

Java hace algunas cosas (como la comprobación de los límites de la matriz) que solo hacen que se ejecute más lentamente. En este código de ejemplo de ruido Java Perlin optimizado, el autor comentó "(el acceso a la matriz es mucho más lento que el acceso de los miembros)". Este tipo de cosas es bastante contrario a la intuición proveniente de un fondo C ++. Pero en Java, tales cosas son.

Digo que dejen de esquivar la bala, aprendan C ++ y utilícenlo.

bobobobo
fuente
1

Debe hacerlo en el idioma que mejor conoce hasta que pueda pagar una educación formal (¿Licenciatura en Ciencias?) En Ciencias de la Computación, haciendo hincapié en el diseño del juego. Posiblemente podría usar su juego para obtener una beca, especialmente si puede decir "Hice esto sin ningún entrenamiento formal en Java"

Las JVM modernas, incluso la de Oracle, tienen muchas, muchas características para abordar las preocupaciones que la gente ha planteado aquí. Puede usar diferentes recolectores de basura para obtener un comportamiento más determinista del recolector de basura. No tengo una amplia experiencia con las bibliotecas 3D, solo un poco con Java3D, pero aquí nadie parece haberse quejado de ellas. El análisis de escape ahora permite la elisión de bloqueo y una asignación mucho más rápida / insignificante de objetos de vida muy corta.

El problema es que, si elige Java de C ++, tendrá que aprender a usar correctamente la concurrencia y comprender bien la administración de la memoria. Después de todo, puedes arruinarlo tan fácilmente malloccomo puedes hacerlo new. No sé cómo son las herramientas para C ++, pero las herramientas de creación de perfiles para Java son bastante fáciles de usar, gratuitas e integradas con el IDE. Puede usarlos para rastrear problemas de rendimiento y aprender .

Ornitorrinco mutante
fuente
55
La educación formal en CS vale la pena por habilidades de programación reales en cualquier disciplina. Lo sabría, estoy en mi tercer año.
DeadMG
44
Definitivamente no estoy de acuerdo con DeadMG. Después de graduarme y elegir los cursos que me gustan, CS tomó mis poderes de desarrollo del juego del 10% al 100%. No me enseñó interfaz de usuario, iconografía, etc., sino codificación real y real.
cenizas999
2
@ ashes999: Entonces tuviste suerte. Mi curso no vale nada y sé que hay muchos otros que sienten lo mismo.
DeadMG
2
@DeadMG es difícil de ver cuando estás estudiando. Una vez que trabaje un par de años F / T y aprenda otras habilidades complementarias, verá. Yo hice. Pero tal vez solo presté mucha atención e intenté aplicar todo a mi hobby de desarrollo de juegos.
cenizas999
1
Yo diría que depende de la escuela y el profesor. Tuve unas excelentes clases de programación donde aprendí muchísimo; y tuve algunos donde realmente sentí que perdí el conocimiento al asistir. Se trata de tener un buen profesor o no. OMI
Nate