¿Es Java una buena opción para juegos multiplataforma? [cerrado]

13

Estoy buscando crear un juego en Java y me gustaría que funcione en Windows, Linux y Mac. Estoy bastante seguro de que C # es una mala elección para esto, y no tengo suficiente experiencia en C o C ++. Quiero alejarme de Flash. Por lo tanto, ¿Java es una buena opción para mí? Principalmente, uso C # y creo que Java es similar, así que supongo que no será tan difícil de aprender. ¿Pero es lo suficientemente rápido? ¿Existe un lenguaje más adecuado para mis necesidades que Java?

Panqueque Comunista
fuente
8
Depende del estilo de juego que quieras hacer. Dependiendo del estilo deseado, podría ser que HTML5 y algunos JavaScript funcionarían para usted, si no Java.
Patrick Hughes el
Oddlab vende juegos basados ​​en Java, por ejemplo, Tribal Trouble. Puede ver los detalles de su motor en oddlabs.com/technology.php
55
Minecraft es un gran ejemplo de un juego multiplataforma escrito en Java. Cuando nuestro muchacho tiene a sus amigos para una sesión seria de Minecraft, lo están jugando en OSX, Windows y Linux.
Kev
Dos años después, C # ahora es bastante bueno para tales cosas con la ayuda del motor de Unity y / o Monogame, que también son compatibles con iOS, Android y WP8.
Magus

Respuestas:

28

Java es extremadamente adecuado para escribir juegos multiplataforma. Ventajas principales:

  • Portabilidad : en general, puede escribir un juego Java y esperar que se ejecute sin cambios en la mayoría de las plataformas. Probablemente sea la opción más portátil de cualquier lenguaje: C / C ++ es la otra opción altamente portátil, pero debe recompilarse para cada plataforma y, en muchos casos, las bibliotecas tienen características específicas de la plataforma que limitan la portabilidad.
  • Rendimiento : el código Java, si se escribe bien, funcionará casi tan bien como cualquier otro lenguaje, incluido C / C ++. El compilador JVM JIT es extremadamente bueno. Puedes escribir un juego exitoso de alta calidad en Java (Minecraft, por ejemplo).
  • Bibliotecas : hay una gran variedad de bibliotecas disponibles para Java que cubren casi todas las funciones que pueda desear en los juegos, desde redes hasta gráficos y sonido e inteligencia artificial. La mayoría de las bibliotecas de Java son de código abierto.

La decisión principal que tendrá que tomar es qué marco de GUI va a utilizar. Hay bastantes opciones diferentes, pero las más destacadas son:

  • jMonkeyEngine : motor 3D completo. Si quieres hacer un juego en 3D, esta es probablemente tu mejor opción: contiene muchas características del motor del juego, como gráficos de escenas, generación de terreno, etc.
  • LWJGL : una biblioteca de más bajo nivel con acceso directo a OpenGL. Es probable que sea atractivo para usted si desea un rendimiento máximo y no le importa escribir mucho de su motor desde cero.
  • Swing : tiene la ventaja de ser extremadamente portátil y está incluido en el tiempo de ejecución de Java, por lo que no necesita una dependencia adicional. Es bueno para juegos 2D no gráficos intensivos (juegos de estrategia, juegos de cartas, etc.)
  • Resbaloso : una biblioteca de juegos en 2D basada en LWJGL. Probablemente sea bueno si desea escribir un juego en 2D pero aún necesita un buen rendimiento gráfico (shoot-em-ups, juegos de plataformas de desplazamiento, etc.)
  • JavaFX : diseñado para aplicaciones de Internet enriquecidas, más o menos como Flash. Tiene muchas características interesantes que serían buenas para los juegos, aunque todavía no lo he visto usar mucho. JavaFX 2.0 en particular parece bastante prometedor.

Las principales desventajas de Java para los juegos están realmente en torno a los "casos extremos" que probablemente no te afectarán pero que son relevantes para algunas clases de juegos:

  • Disponibilidad del motor 3D : aunque las herramientas y los motores enumerados anteriormente son buenos, todavía no están a la altura de los motores C / C ++ como el Unreal Engine utilizado por las compañías de juegos profesionales. Por lo tanto, Java posiblemente no sea su primera opción si está tratando de desarrollar un FPS importante con un presupuesto multimillonario: C / C ++ todavía gana aquí.
  • La recolección de basura de Java con latencia de GC es en general un gran beneficio, pero puede causar pausas leves cuando ocurren los ciclos de GC. Esto está mejorando mucho con las nuevas JVM de baja latencia, pero aún puede ser un problema para los juegos con requisitos de latencia muy baja (quizás los shooters en primera persona). Una solución alternativa es usar bibliotecas de baja latencia como http://javolution.org/ , sin embargo, estas parecen estar más orientadas a sistemas de comercio de alta frecuencia o en tiempo real en lugar de juegos.
  • Falta de capacidad para explotar optimizaciones de bajo nivel : si bien el compilador JIT de Java es increíblemente bueno, todavía impone algunas restricciones que no puede evitar (por ejemplo, la comprobación de límites en matrices). Si realmente necesita obtener acceso nativo a nivel de código de máquina para optimizar este tipo de cosas, probablemente volverá a preferir C / C ++ a Java.

Tenga en cuenta que también hay algunas opciones de implementación a tener en cuenta:

  • Applet : se ejecuta en un navegador, muy conveniente para los usuarios, sin embargo, los applets están bastante restringidos en lo que pueden hacer por razones de seguridad. Tenga en cuenta que puede firmar applets para obtener privilegios de seguridad adicionales, aunque esto provocará un aviso un poco aterrador para la mayoría de los usuarios.
  • Java Web Start : mejor para juegos más sofisticados que necesitan una descarga local completa y también necesitan acceder a los recursos del sistema local. También funciona de una manera bastante independiente de la plataforma. Probablemente la mejor ruta para un juego de tamaño mediano o algo que necesita escapar de las restricciones de seguridad de los applets.
  • Descarga del instalador : puede escribir un instalador para un juego Java tal como lo haría para cualquier otro idioma. Es un poco más difícil de configurar y probar, por supuesto, ya que los instaladores tienden a tener algunas características específicas de la plataforma.
  • Web : puede escribir una aplicación web HTML5 y utilizar la fuerza de Java únicamente en el lado del servidor. Vale la pena considerarlo para un juego web multijugador.

Finalmente, también vale la pena considerar algunos de los otros lenguajes JVM: estos tienen todos los beneficios de la plataforma Java enumerada anteriormente, pero algunos los consideran mejores lenguajes que el propio Java. Scala, Clojure y Groovy serían los más destacados, y todos pueden hacer uso de las herramientas y bibliotecas de Java enumeradas anteriormente.

mikera
fuente
1
JWS realmente no agrega mucho sobre los applets, aparte de separar su aplicación del navegador. En ambos casos, creo que querrá firmar su código si está utilizando una biblioteca OpenGL.
Peter Taylor
2
Yo diría que el acceso al sistema local es un gran "mucho" sobre las restricciones de applet para muchos juegos serios, especialmente el multijugador. HTML5 es ordenado, pero sigue siendo un pequeño bebé con soporte irregular y partes importantes como GL y Sockets desactivados en muchos navegadores, además el audio aún no es adecuado para el uso del juego.
Patrick Hughes
1
@PatrickHughes, si desea que el acceso al sistema local desde JWS sin grandes diálogos de miedo, deberá firmar su código, y un applet firmado generalmente también tendrá acceso al sistema local.
Peter Taylor
También puede usar Inno Setup para distribuir sus juegos Java.
Mahmoud Hossam
1
Puede agregar LIBGDX a la lista de paquetes que lo ayudan a escribir su propio motor; Tiene configuraciones y optimizaciones JNI para varias plataformas e incluso Android y hasta OpenGL ES.
Patrick Hughes
4

Minecraft y Blocks that Matter están construidos en Java, así que sí, es bastante bueno para hacer juegos. El principal problema con el que te encontrarás mientras usas Java es portar a plataformas móviles si eliges esa ruta y escribes una aplicación nativa. Android es una especie de Java SE frankensteined con una biblioteca separada. Blackberry de RIM usa Java ME. En teoría, iOS puede programarse con Java, aunque Objective-C probablemente sería una mejor opción para esa plataforma.

Java es bastante similar a C #. A menudo encuentro el código C # comprensible a pesar de solo conocer Java. Tienen una filosofía de diseño diferente, pero en cuanto a ser ampliamente desplegables con una molestia mínima, ambos encajan perfectamente. C # no es una opción terrible para los juegos de ninguna manera, aunque su implementación móvil será más difícil y la implementación en plataformas que no sean Windows llevará más tiempo o será más difícil dependiendo de las bibliotecas externas específicas, etc., que termine usando.

Ingeniero mundial
fuente
1
Java en dispositivos móviles: compilar una vez, depurar en todas partes: '(.
deadalnix
0

La forma más obvia y menos resistente es usar el combo HTML5 + javascript. Cualquier aplicación o juego creado con esto se ejecutará en casi todos los dispositivos y navegadores.

Ventaja : - Necesitarás una configuración cero para que tu juego se ejecute en varias plataformas y dispositivos.

NOTA: - He visto algunos juegos que se crean utilizando las tecnologías mencionadas anteriormente, pero eran más pequeños en estatura. Pero supongo que si uno puede hacer mantequilla con leche, entonces el queso no es imposible

Pankaj Upadhyay
fuente
0

Puede usar Scala y Scheme Bigloo en Eclipse para usar JVM para código estresado o acción paralela dentro de su juego Java.

Con Pattern Design y UML2, también puede asegurar el código con OCL, todo está en Topcased.org.

Dominar esas herramientas lleva tiempo, pero son el fondo de Java, la base que lo llevará a la cima.

cl-r
fuente
-10

Respuesta corta: no.

Java no genera un ejecutable binario, sino solo bytecode como lo hace C # (CLI), y esto no es algo bueno para negocios serios en "entornos abiertos" por dos razones principales:

  • La probabilidad de quedar atrapado en la ingeniería inversa es muy alta, especialmente con lenguajes antiguos y muy conocidos como Java
  • no tiene el control total sobre el rendimiento de la máquina, en el caso de Java, la JVM juega un papel importante tomando el control total.

Por supuesto, cada idioma tiene sus propias bibliotecas, pero debido a la gran cantidad de ellas para cada idioma, este no es un problema real y no creo que sea el propósito de este tema.

Tal vez a nivel profesional pueda encontrar algo que pueda romper la regla, como un kit de desarrollo que pueda traducir todas las declaraciones de C # en código de ensamblaje para una máquina del mundo real, pero si este tipo de enfoque no está en las tarjetas, está prácticamente obligado a hacerlo considere solo el C y el C ++ para su desarrollo cuando tenga como objetivo vender su producto en un entorno abierto.

Las cosas son un poco diferentes para los dispositivos móviles porque son un "entorno cerrado", incluso Android está prácticamente cerrado teniendo en cuenta el hecho de que la fuente de las ROM del mundo real no suele estar disponible para el público, Android puede considerarse de código abierto, pero el 99 % de las ROM en dispositivos reales no lo son. En estos casos, no puede discutir demasiado, todo ya está configurado para usted y cada plataforma tiene su propio idioma, como todos saben.

Al final, si va a vender estos productos en entornos abiertos, solo puedo sugerir idiomas que puedan producir código compilado y binario / ensamblado, en entornos cerrados, la decisión es típicamente más fácil de hacer por diferentes razones.

Micro
fuente
77
Parece creer que los binarios compilados son más difíciles de aplicar ingeniería inversa que los binarios de código de bytes. Puede haber algo de verdad en eso, pero no mucho. De hecho, probablemente más personas puedan trabajar con el desensamblador x86 y x64 que con CLI o bytecode de Java, y se sorprenderá de lo útil que puede ser una herramienta como IDA Pro (descargo de responsabilidad: no lo he usado desde la versión gratuita) hace años, probablemente sea aún más fácil ahora). Un archivo de código de bytes ofuscado puede ser aún más difícil de realizar ingeniería inversa y, en cualquier caso, la mayoría de las personas tendrán pocas razones para preocuparse.
Steve314
2
¿Por qué poca razón para preocuparse? Bueno, ¿cuántas personas escriben sus propios motores de juego patentados de bajo nivel? E incluso si haces eso, ¿cuáles son las probabilidades de que alguien prefiera robarte la tuya? motor de código abierto gratuito bien documentado? La piratería del programa completo es una preocupación real mucho más probable que la ingeniería inversa para robar ideas de código, y los piratas no parecen ser disuadidos en lo más mínimo por el código compilado nativo.
Steve314
1
En los niveles de abstracción, las instrucciones de JVM tienen un nivel extremadamente bajo, no precisamente como en el hardware, sino básicamente tan lejos de la abstracción de la capa de aplicación. Donde el recuento de capas de abstracción está en las bibliotecas Java estándar, lo que significa que realmente hay pocas capas entre la plataforma y la aplicación final. Excepto que normalmente ocurre en C y C ++ de todos modos (por qué reinventar libpng, etc.): la mayoría de las personas usarán bibliotecas comunes que efectivamente forman un conjunto de plataformas ampliamente conocidas, y buenas herramientas de ingeniería inversa pueden reconocerlas.
Steve314
3
Para satisfacer los requisitos, todo el código debería enviarse en FPGA y encerrado en epoxi. Sorpresa, incluso los paquetes de chips de caja negra pueden y tienen ingeniería inversa todo el tiempo. Entonces, incluso gigantes poderosos como Intel introducen errores en sus paquetes de CPU, por lo que su caja negra de hardware incrustada en epoxy aún sufrirá exposición a las bibliotecas de hardware. Finalmente el llamado a la seguridad por la oscuridad, eso no funciona. Reductio ad absurdum, lo sé, pero también lo es la respuesta original.
Patrick Hughes
3
Desafortunadamente no tengo la reputación suficiente para descalificarte. Todos sus argumentos han fallado. Hay gente por ahí decodificando, descompilando y pirateando juegos producidos en C, C ++ o cualquier lenguaje, por lo que ser un paquete binario no proporcionará mucha seguridad adicional. Además, si el OP está preocupado por esto, hay muchos muy buenos ofuscadores de Java. Sobre el control total del rendimiento de la máquina, la mayoría de los programadores de C y C ++ tampoco tienen esto, solo escriba un buen código y el compilador optimizará lo que se necesita. E incluso si eso es un problema, podría usar JNI o ​​JNA.
Victor Stafusa