¿Por qué solo unos pocos videojuegos están escritos en Java? [cerrado]

171

¿Por qué no hay muchos videojuegos comerciales en 3D (no aleatorios de código abierto en 2D) escritos en Java? En teoría, tiene mucho sentido: obtienes un impulso de productividad y una aplicación multiplataforma casi gratis, entre otras cosas, como la gran cantidad de bibliotecas Java y la recolección de basura incorporada (aunque admito que ' No estoy seguro de si esto último es algo bueno). Entonces, ¿por qué rara vez se usa? Solo puedo pensar en un par de juegos comerciales populares escritos para la plataforma Java.

¿Es por el rendimiento? Si es así, ¿la GPU no haría la mayor parte del trabajo pesado?

Sasha Chedygov
fuente
1
Re: mmyers; Estoy un poco sorprendido de que ESE juego ganó el premio a los "mejores gráficos", incluso en 2005 ...
CloudyMusic
2
Sí, pero la mayoría de los "juegos reales" no se hacen en .net administrado ¿verdad? ¿Están hechos en la vieja escuela c / c ++?
Hardwareguy
14
Runescape está escrito en java.
GameFreak
44
¡Minecraft está escrito en Java!
daGrevis

Respuestas:

155

El mundo del desarrollo del juego es divertido: por un lado, a menudo aceptan rápidamente nuevas ideas, por otro lado, todavía están en la edad de piedra.

La verdad es que rara vez hay tantos incentivos para cambiar a .NET / Java / algo que no sea C / C ++.

La mayoría de las compañías de juegos licencian partes del motor de juego de otras compañías. Estas partes están escritas en C ++, y aunque es posible que tenga acceso a la fuente para poder portarlo, eso requiere mucho esfuerzo (y, por supuesto, la licencia debe permitirlo).

Además, ya existe una gran cantidad de código heredado en C ++. Si el código de proyectos anteriores se puede reutilizar (por ejemplo, si está escribiendo una secuela), eso cuenta aún más a favor de quedarse con el mismo idioma, en lugar de reescribirlo en un nuevo idioma (más aún, ya que es probable que reintroduzca una tonelada de errores que necesitarás para pasar el tiempo arreglando.

Finalmente, de todos modos, es raro que los juegos se escriban en 100% C ++: se hace mucho usando lenguajes de script, ya sea personalizados o simplemente integrando idiomas existentes (Lua es uno de los más populares en estos días).

En lo que respecta a la recolección de basura, eso puede ser un pequeño problema. El problema no es tanto que exista, sino más bien cómo funciona: el recolector de basura NO DEBE ser bloqueante (o al menos se garantiza que solo se bloqueará brevemente), ya que es simplemente inaceptable que el juego se congele durante 10 segundos escanea toda la memoria asignada para ver qué se puede liberar. Sé que Java tiende a ahogarse un poco en GC'ing cuando está cerca de quedarse sin memoria (y para algunos juegos, lo hará).

También está un poco más restringido en lo que puede hacer: no puede explotar completamente el hardware debido a la sobrecarga del tiempo de ejecución. Imagina que Crysis está escrito en Java ... incluso si esa es la única diferencia visible, simplemente no sería la misma (también estoy bastante seguro de que necesitarías un Core i7 para ejecutarlo).

Esto no significa que estos lenguajes no tengan su lugar en el desarrollo de juegos, y no, no solo me refiero a la programación de herramientas. Para la mayoría de los juegos, no necesita ese rendimiento adicional que obtiene de C ++, incluidos los juegos en 3D, y si está escribiendo todo desde cero, puede tener mucho sentido usar algo como XNA; de hecho, hay un buena oportunidad lo hará.

En cuanto a los juegos comerciales, ¿ cuenta RuneScape ? Ese podría ser el juego Java más exitoso que existe.

Michael Madsen
fuente
16
Bueno, obviamente no ejecutarías Crysis en la JVM; diablos, si codificaras ese juego en lenguaje ensamblador, aún necesitarías una supercomputadora para ejecutarlo en la configuración completa. Pero +1 por la excelente visión, gracias.
Sasha Chedygov
15
No puedes comparar Unreal Tournament 3 o Crysis con Runescape. Si la calidad gráfica es una preocupación, debe seguir con un lenguaje de bajo nivel con la menor sobrecarga posible. Por supuesto, para Indy o juegos donde los gráficos no son el principal argumento de venta, Java es una excelente alternativa a C / C ++.
GuiSim
66
@GuiSim: para la mayoría de los juegos, la calidad de los gráficos NO es un punto de venta importante. Solo hay un puñado de juegos en los que puedo pensar que fueron creados con gráficos en mente (estoy pensando en Crysis, pero también en Half-Life 2, en ese momento). No creo que la mayoría de los desarrolladores de juegos se preocupen tanto por los gráficos, siempre y cuando sean "lo suficientemente buenos" (también conocidos como la mayoría de los otros juegos).
Sasha Chedygov
44
Los gráficos realmente tienen muy poco que ver con el lenguaje. Física, IA, sí. Gráficos, no.
JulianR
10
@JulianR puede haber una carga de trabajo significativa para preparar y mantener una escena para que se represente de manera eficiente, por lo que el lenguaje y la sobrecarga del idioma asociado son importantes para los gráficos.
KSchmidt
95

Creo que John Carmack lo dijo mejor con:

El mayor problema es que Java es realmente lento. En un nivel de CPU / memoria / pantalla / comunicaciones puro, la mayoría de los teléfonos celulares modernos deberían ser plataformas de juego considerablemente mejores que un Game Boy Advanced. Con Java, en la mayoría de los teléfonos le queda la potencia de CPU de una PC IBM original de 4.77 mhz y un control pésimo sobre todo. [... recorte ...] Escribir-una vez-ejecutar-en cualquier lugar. Decir ah. Jajajajaja En este momento solo estamos probando en cuatro plataformas, y ni un solo par tiene exactamente las mismas peculiaridades. Todos los juegos comerciales se modifican y compilan individualmente para cada plataforma (a menudo más de 100). La portabilidad no es una justificación para el horrible desempeño.

( fuente )

Por supuesto, estaba hablando de plataformas móviles, pero he encontrado problemas similares con Java en su conjunto provenientes de un entorno C ++. Echo de menos poder asignar memoria en el Stack / Heap en mis propios términos.

Bagazo
fuente
61
Esa cita fue de 2005. Tanto la tecnología Java como la potencia de los teléfonos celulares han mejorado considerablemente desde entonces. Comparar juegos de teléfonos celulares con juegos de PC es comparar manzanas con naranjas.
Chris Dail
78
John Carmack lo dijo. Caso cerrado.
GuiSim
41
Me siento incómodo cuando leo "Java es realmente lento". Es como decir que un auto deportivo de $ 50k es lento en comparación con un auto deportivo de $ 100k. Claro, es más lento, pero el 90% del tiempo, el trabajo que hace sigue siendo excelente y a la mitad del costo;) No se pretende una guerra de llamas. Estoy de acuerdo en que las razones anteriores son las razones por las que Crysis y los juegos similares no están escritos en Java.
Ross
17
@ Chris Dail, esto pone de relieve todo el problema con el rendimiento de Java. ¿Ha mejorado el rendimiento de Java? No, los teléfonos celulares son más rápidos. Se supone que los juegos empujan los límites del realismo y, por lo tanto, empujan los límites del hardware, y desechar% 30-% 40 de su rendimiento incluso antes de que haya escrito una línea de código es inaceptable.
cgp
8
Esta disputa me parece muy extraña. Java ME no es lo mismo que Java en Android y tampoco es lo mismo que Java en PC. Java ME usualmente dependía de los fabricantes de teléfonos para crear una JVM. Algunos hicieron un buen trabajo, otros no. No es de extrañar que Carmack se quejara de ellos. Android tiene su propia VM que no es una JVM. Y tiene algunos problemas serios (desde mi punto de vista). Oracle HotSpot VM es completamente diferente de ambos casos. Si las personas comparan todas estas cosas, lo único que puedo concluir es que no saben de qué están hablando.
Malcolm
54

Por un lado, la falta de sobrecarga del operador de Java hace que todas las matemáticas con las que tiene que lidiar para obtener una tubería de gráficos que funcionen sean muy, muy molestas y difíciles de leer.

Todos los vectores afines y de multiplicación de matrices con los que necesita tratar son mucho más fáciles de seguir si están en expresiones matemáticas bien formadas en lugar de expresiones orientadas a objetos como

product = vector.multiply(projectionMatrix).dotProduct(otherVector);

Eso es simplemente terrible. Las matemáticas no deberían verse así.

Welbog
fuente
19
Recuerdo que en el '96 creo que fue, algunos de los diseñadores de Sun estaban dando una presentación sobre Java en Berkeley. William Kahan ( en.wikipedia.org/wiki/William_Kahan ) les estaba dando una mierda sobre este mismo problema. :)
JP Alioto
13
Creo que hay una buena razón para no permitir la sobrecarga del operador en un idioma: para evitar que la gente lo use. Es una herramienta poderosa y muy buena para las matemáticas, pero es peligrosa para todo lo demás. Por flojos que sean los codificadores, tienden a usarlo incorrectamente para acortar el código, y en el momento en que las personas comienzan a realizar un mapa multiplicando un iterable con una función, o incluso cuando todas las operaciones aritméticas están definidas para funciones, la legibilidad del código está a punto de llegar a 0. y Sí, he pasado una cantidad considerable de tiempo portando código como ese. : -S es una elección de diseño. y las opciones de diseño siempre tienden a ser discutibles.
back2dos
19
¿Castigar a todos los demás por algunas manzanas podridas? Esta es una razón por la que prefiero C #. Si realmente necesito una sobrecarga del operador, está ahí.
ChaosPandion
1
Básicamente, la sobrecarga del operador solo es realmente apropiada para 2-3 situaciones diferentes en el diseño de OOP (vectores, matrices, números complejos). En la mayoría de las otras situaciones, está demasiado poco definido y solo conduce a un código descuidado, una sintaxis débil y una documentación deficiente, incluso de personas que saben cómo usarlo. Creo que por eso Sun optó por no usarlo en Java, y creo que es una decisión válida.
bgroenks
1
@MMJZ: ¿Qué tienen que ver las expresiones lambda con la sobrecarga del operador?
Sasha Chedygov
26

Creo que .NET tuvo (tiene) muchos de los mismos problemas percibidos que tiene Java. Microsoft acaba de hacer un mejor trabajo en marketing para desarrolladores con XNA :-)

Joel Martinez
fuente
10
XNA también hace posible implementar su aplicación .NET en XBox. No he visto nada tan suave para Java.
StriplingWarrior
También puede implementar en Zune también.
cbeuker
Una pregunta un poco más antigua, pero solo para actualizar, ahora también puedes escribir juegos XNA para Windows Phone :-)
Joel Martinez
3
@JoelMartinez otra actualización: no es posible escribir juegos XNA para Windows Phone 8.
Tomas Andrle
@TomA Ahora es posible escribir juegos de monojuegos para WP8
Alex Lapa
17

Puntos menores primero:

  • Cualquier aumento de la productividad de Java es hipotético. La sintaxis es casi idéntica a C ++, por lo que realmente solo cuenta con los ahorros de la administración de memoria y las bibliotecas estándar. Las bibliotecas tienen poco que ofrecer a los desarrolladores de juegos y la administración de memoria es un tema polémico debido a la recolección de basura.

  • multiplataforma "gratis" no es tan bueno como cree porque pocos desarrolladores quieren usar OpenGL y varias plataformas clave probablemente carecen de una buena implementación de Java o envoltorios para sus bibliotecas nativas, ya sea para gráficos, audio, redes, etc.

Pero principalmente, el problema es la compatibilidad con versiones anteriores. Los desarrolladores de juegos se trasladaron a C ++ desde C y hacia C desde el ensamblaje simplemente porque la ruta de migración era fluida. Cada uno interactúa estrechamente con el anterior, y todo su código anterior era utilizable en el nuevo lenguaje, a menudo a través de un único compilador. Por lo tanto, la migración fue tan lenta o tan rápida como quisiera. Por ejemplo, algunos de nuestros encabezados antiguos en uso todavía tienen #ifdef WATCOMCy no creo que nadie haya usado el compilador de Watcom aquí en una década o más. Hay una inversión masiva en código antiguo y cada bit solo se reemplaza según sea necesario. Ese proceso de reemplazar y actualizar partes y piezas de un juego a otro no es tan práctico si cambias a un idioma que no interopera de forma nativa con tu código existente. Sí, la interoperabilidad de C ++ / Java es posible, pero muy poco práctica en comparación con simplemente escribir "C con un poco de C ++" o incrustar bloques asm en C.

Para reemplazar correctamente C ++ como el lenguaje de elección de los desarrolladores de juegos, debe hacer una de dos cosas:

  1. Sea fácilmente interoperable con el código heredado existente, preservando así la inversión y manteniendo el acceso a las bibliotecas y herramientas existentes, O
  2. Demostrativamente muestra un aumento de productividad lo suficientemente adelantado como para que el costo de reescribir todo su propio código (o reelaborar las interfaces en componentes reutilizables que puedan usarse desde ese idioma) esté más que cubierto.

Subjetivamente, no creo que Java cumpla con ninguno de esos. Un lenguaje de nivel superior podría cumplir con el segundo, si alguien es lo suficientemente valiente como para ser el pionero. (EVE Online es probablemente el mejor ejemplo que tenemos de Python siendo utilizable, pero que utiliza una bifurcación del lenguaje principal de Python, muchos componentes C ++ para el rendimiento, e incluso eso es para un juego bastante poco exigente en términos modernos).

Kylotan
fuente
Solo quería agregar, EVE Online es una simulación espacial 'en línea', donde las batallas de jugador contra jugador entre 1000 y 1000 son comunes, lo que puede considerarse un escenario exigente en términos de rendimiento. Aunque sus partes intensivas en velocidad están escritas en C / C ++, sigue siendo un estudio interesante sobre los desafíos de usar un lenguaje de alto nivel (Python) en los juegos.
Hakan Deryal el
Sin embargo, recuerde que el rendimiento en los juegos multijugador del lado del servidor se mide por métricas ligeramente diferentes al rendimiento en los juegos del lado del cliente para un solo jugador: el primero está más preocupado por el rendimiento, el segundo con la latencia.
Kylotan
Sí, eso es cierto, pero esas batallas incluyen más de 2000 naves en pantalla, con más de 2000 proyectiles (misiles, con animaciones), explosiones, etc., lo que requiere un alto rendimiento gráfico. De todos modos, gracias por la respuesta detallada, sigue siendo cierto.
Hakan Deryal
1
Si cree que la sintaxis de C y Java es la misma y, por lo tanto, tiene alguna relación con el rendimiento, realmente no comprende lo que está sucediendo. ¿Cómo podría C decidir en tiempo de ejecución que una función determinada se llama repetidamente con los mismos parámetros y reemplazar toda la llamada de función con una constante mientras se retiene la llamada de función cuando hay una desviación en los parámetros? No digo que el tiempo de ejecución sea siempre mejor o siempre peor, ¡solo que no tiene relación alguna con la sintaxis!
Bill K
1
@BillK: parece que has leído mal. Mencioné la sintaxis solo con referencia a la 'productividad', no al 'rendimiento'. Es cierto que las optimizaciones JIT podrían hacer que Java sea más rápido en teoría, pero esto no ocurre en la práctica, al menos no en el software del juego.
Kylotan
12

Estoy jugando a Los Sims 3, e hice algunas hurgadas. El motor de gráficos es C ++, mientras que el motor de secuencias de comandos y comportamiento es C # / Mono. Entonces, aunque C ++ está allí para bits críticos de tiempo, otras cosas como interacción, lógica de juego, AI está en un lenguaje administrado orientado a objetos.

John Simon
fuente
55
y luego para la versión de Mac, introducen todo dentro de una máquina virtual Wine modificada. Aún más rápido de lo que sería en Java directo, creo :-)
Ben Gotow
10
Wine no es una máquina virtual, es una biblioteca de tiempo de ejecución que imita el comportamiento de las bibliotecas de tiempo de ejecución de Windows. De ahí el nombre (El vino no es un emulador).
Nate CK el
2
Esto es muy común en los juegos, a menudo la lógica que no es crítica para el tiempo se escribe en algún tipo de lenguaje de script, comúnmente lua o python.
KSchmidt
Sin embargo, no es Mono de vainilla. EA necesitaba un equipo especial que trabajara en su propio CLR personalizado a tiempo completo para que funcionara.
Crashworks
44
Solo una nota al margen de que los Sims 3 son conocidos por su bajo rendimiento incluso en computadoras excelentes.
Lotus Notes
12
  • ¿Hay algún buen puerto de motores de juego / bibliotecas?
  • Muchos desarrolladores de C / C ++, particularmente los de Windows (donde se escriben la mayoría de los juegos comerciales) están familiarizados con Visual Studio. No hay comparación en IDEs.
  • En general, Java se ha vendido a las empresas debido a su tipografía sólida y tiene la percepción de no tener problemas de administración de memoria.
  • Y sí, Java aún sufre la percepción de que es lenta, y su administración de memoria es deficiente, y para los juegos, probablemente no sea adecuada para la tarea. Como se indicó en algunas de las otras respuestas, la recolección de basura simplemente no va a ser suficiente cuando se trata de requisitos de alto rendimiento en tiempo real. Los videojuegos llevan las CPU y GPU a sus límites.
cgp
fuente
1
+1 para el texto en negrita. La gente no parece darse cuenta de que cuando su juego se ejecuta a 20 fps, a menudo está limitado por hardware a 20 fps. Realmente quiere llegar a más de 30 fps ... pero no puede.
GuiSim
Sin embargo, no creo que solo el GC sea el problema en cuanto al rendimiento ... ni siquiera eso, junto con la fase de inicio lento ... son problemas generales de rendimiento, pero eso soy solo yo.
rogerdpack
2
Creo que en este punto es más probable que esté de acuerdo que en el pasado. La optimización de la JVM ha mejorado; sin embargo, a la luz de las mejoras de rendimiento en lenguajes poco escritos como JavaScript y otros, el rendimiento de Java en comparación es bastante inexcusable. Hay muchos apologistas para el desempeño de Java. (pero el rendimiento percibido al final es lo único que importa) '
cgp
10

Una de las principales razones por las que Java y otros lenguajes de máquinas virtuales no se utilizan para los juegos se debe a Garbage Collection. Lo mismo ocurre con .NET. La recolección de basura ha recorrido un largo camino y funciona muy bien en la mayoría de los tipos de aplicaciones. Sin embargo, para realizar la recolección de basura, debe pausar e interrumpir la aplicación para recolectar la basura. Esto puede causar un retraso periódico cuando ocurre la recolección.

Java tiene el mismo problema para las aplicaciones en tiempo real. Cuando las tareas deben ejecutarse en un momento específico, es difícil que una tarea automatizada como la recolección de basura lo respete.

No es que Java sea lento. Es que Java no es bueno para manejar tareas en tiempo real.

Chris Dail
fuente
1
Sin embargo, puede escribir su propio planificador para el recolector de basura si va a llegar a portar Java a un nuevo entorno. La memoria debe recuperarse de cualquier manera, y en un entorno en tiempo real, podría tener la opción de cuándo programar su gc ... lo mejor de ambos mundos. Tengo que volver al punto de que no hay muchas razones para portar Java a una arquitectura para hacer las cosas que quieres que haga cuando C / C ++ ya hace esas cosas por ti. Java brilla en otros lugares.
San Jacinto
55
Esto no es la década de 1990. Los recolectores de basura son bastante buenos ahora cuando están sintonizados para una pausa baja.
Tom Hawtin - tackline
8

Una razón importante es que los videojuegos requieren un conocimiento directo del hardware que se encuentra debajo, a menudo, y realmente no hay una gran implementación para muchas arquitecturas. Es el conocimiento de la arquitectura de hardware subyacente lo que permite a los desarrolladores exprimir cada onza de rendimiento de un sistema de juego. ¿Por qué tomaría el tiempo de transferir Java a una plataforma de juego y luego escribir un juego sobre ese puerto cuando podría simplemente escribir el juego?

editar: esto quiere decir que es más que un problema de "velocidad" o "no tengo las bibliotecas correctas". Esas dos cosas van de la mano con esto, pero es más una cuestión de "¿cómo hago para que un sistema como la celda ejecute mi código Java? Realmente no hay ningún buen compilador de Java que pueda administrar las tuberías y los vectores como necesito .. "

San jacinto
fuente
7

El problema de rendimiento es la primera razón. Cuando vea el tipo de código C ++ hiper optimizado que hay en los motores Quake ( http://www.codemaestro.com/reviews/9 ), sabrá que no perderán su tiempo con una máquina virtual.

Claro que puede haber algunos juegos .NET (¿cuáles? Me interesa. ¿Hay algunos realmente intensivos en CPU / GPU?), Pero supongo que es más porque mucha gente es experta en tecnologías de MS y siguió a Microsoft cuando lanzaron Su nueva tecnología.

Ah, y multiplataforma simplemente no está en la mente de las compañías de videojuegos. Linux es solo alrededor del 1% del mercado, Mac OS un poco más. Definitivamente piensan que no vale la pena deshacerse de las tecnologías y bibliotecas exclusivas de Windows como DirectX.

Ksempac
fuente
3
"multiplataforma simplemente no está en la mente de las compañías de videojuegos" - Es por eso que respeto totalmente a las compañías que lo hacen. :)
Sasha Chedygov
Definitivamente estoy agradecido con Carmack por estar tan comprometido con el multiplataforma y el código abierto. Simplemente dije lo que la mayoría de las compañías piensan.
Ksempac
1
Es verdad. No ves muchos videojuegos populares portados a Linux. :(
Sasha Chedygov
Multiplataforma no es solo un sistema operativo cruzado. Piensa en PS3, Xbox 360, Wii.
JulianR
"No van a perder el tiempo con una máquina virtual". en.wikipedia.org/wiki/Quake_III_Arena#Virtual_machine , Carmack construyó el suyo para la lógica del juego.
James McMahon el
4

También puede preguntar por qué las aplicaciones web no están escritas en C o C ++. El poder de Java reside en su pila de red y diseño orientado a objetos. Por supuesto, C y C ++ también tienen eso. Pero en una abstracción más baja. Eso no es nada negativo, pero no quieres reinventar la rueda cada vez, ¿verdad?

Java tampoco tiene acceso directo al hardware, lo que significa que está atascado con la API de cualquier marco.

Markus
fuente
Java puede llamar a código nativo a través de "JNI"
Bart van Heukelom
44
... y pierde portabilidad mientras lo haces!
LiraNuna
1
Realmente no pierdes mucha portabilidad cuando usas JNI. Siempre que todavía pueda compilar las bibliotecas nativas en las plataformas que desea admitir, básicamente significa que solo tiene que portar / recompilar el 1% de su código en lugar de todo. Todavía obtienes muchos beneficios de la portabilidad de Java.
bgroenks
4

Mis ideas erróneas sobre el rendimiento y las optimizaciones de JVM pobres serían mi suposición. Digo conceptos erróneos sobre el rendimiento porque hay algunos puertos Java de juegos C ++ que funcionan más rápido que sus contrapartes C ++ (ver Jake 2). El verdadero problema, en mi humilde opinión, es que muchos programadores de Java no se centran tanto en el rendimiento de vanguardia como lo son con la facilidad de uso y la comprensión / mantenibilidad del código. En el lado C / C ++ de las cosas, básicamente está codificando en un lenguaje ensamblador de nivel ligeramente más alto y está lo más cerca posible del hardware sin escribir en ensamblador o código máquina directo.

illvm
fuente
Si está "lo más cerca posible del hardware sin escribir en el ensamblaje", entonces Java no podrá superarlo, a menos que su codificación sea terrible. Cuanto más te acerques al hardware, más rápido podrás llegar.
Josh Johnson
4

La lista de motores de juegos en Wikipedia enumera muchos motores de juegos junto con el lenguaje de programación en el que están escritos.

Hay varios motores de juegos Java listados.

Al hacer clic en algunos de los enlaces, encontrará ejemplos de juegos y demostraciones escritos en Java. Aquí hay una pareja:

Para ciertos juegos y situaciones, las compensaciones de Java pueden ser aceptables.

JohnB
fuente
Sé que existen juegos escritos en Java. Pero además de Minecraft y Runescape, muy pocos juegos comerciales convencionales están escritos para la plataforma Java. ¿Cuántos títulos AAA se escribieron en Java? ¿Y por qué tan pocos? De ahí mi pregunta.
Sasha Chedygov
3

.NET definitivamente tiene algunos de los mismos problemas que Java cuando se trata de un rendimiento 3D intenso. Microsoft también ha invertido mucho más tiempo y dinero en el desarrollo de las bibliotecas a la hora de trabajar con operaciones pesadas en 3D.

(... personalmente, también creo que tenían una ventaja cuando se trata de la magia entre DirectX y .NET)

Justin Niessner
fuente
2
  1. Java es lento, la GPU no maneja la mayor parte del trabajo pesado. Todavía hay animación, física e IA en la CPU, todo lo cual consume mucho tiempo.

  2. Java no existe en las consolas, y las consolas son un objetivo importante para los juegos comerciales. Si usa Java en la PC, está eliminando su capacidad de portar a consolas dentro de un tiempo y presupuesto razonables.

  3. Muchos de los codificadores más experimentados en la industria del juego han estado usando C y C ++ mucho antes de que Java se hiciera popular. Los dos puntos anteriores pueden contribuir a esto, pero espero que muchos programadores profesionales de juegos simplemente no conozcan Java tan bien.

  4. El punto de otra persona sobre el middleware anterior fue bueno, así que lo estoy agregando a mi respuesta. Hay mucho código heredado y middleware escrito específicamente para vincular con C / C ++, y la última vez que verifiqué que Java no tiene una buena interoperabilidad. El uso de Java para la mayoría de las empresas implicaría tirar una gran cantidad de código, gran parte del cual se ha pagado de una forma u otra.

Dan Olson
fuente
3
Puede usar JavaCL, JOCL o APARAPI para descargar mucho de eso a la GPU.
bgroenks
2

En realidad, es muy posible que el código administrado haga juegos en 3D, el problema son los motores traseros. Con .Net, durante un breve período, hubo un contenedor DirectX administrado para DirectX 9 de Microsoft. Esto fue antes de la abstracción que ahora es XNA.

Al tener acceso total a la API de DirectX, los juegos .Net funcionan de maravilla. El mejor ejemplo que conozco es www.entombed.co.uk, que está escrito en VB.Net.

Desafortunadamente, en el lado de Java, carece seriamente, principalmente por la razón de que DirectX no está disponible para Java, y los programadores de juegos conocen y entienden la API de DirectX, ¿por qué aprender otra API cuando regrese a DirectX?

Foz
fuente
2

El marketing de juegos es un proceso comercial; Los editores quieren retornos cuantificables de bajo riesgo sobre su inversión. Como consecuencia, el enfoque generalmente está en trucos tecnológicos (con excepciones) que los consumidores comprarán para producir un rendimiento confiable; estos tienden a ser efectos visuales superficiales como el deslumbramiento de lentes o una resolución más alta. Estos efectos son confiables porque simplemente usan aumentos en la potencia de procesamiento: explotan los aumentos de hardware / ley de Moore. Esto implica el uso de C / C ++: Java generalmente está demasiado abstraído del hardware para explotar estos beneficios.

Daniel Collicott
fuente
1

Supongo que la velocidad sigue siendo el problema. La multiplataforma será un problema, ¿no es así, ya que no sabes qué tarjeta 3D está disponible cuando escribes el código? ¿Tiene Java algo para admitir el descubrimiento automático de capacidades 3D? Y supongo que hay herramientas para facilitar la transferencia de un juego entre wii, xbox y ps3, pero apuesto que es costoso.

La ps3 tiene java, a través del soporte de blue ray. Consulte el sitio bd-j.

lumpynose
fuente
1

Incluso los juegos escritos en la plataforma .Net a menudo están altamente optimizados para la velocidad, como el acceso directo a la memoria y el bus. .Net permite usar C / C ++ y mezclarlo con lenguajes de nivel superior como C #.

Los estudios de desarrollo de juegos a menudo trabajan en estrecha colaboración con los proveedores de hardware, que proporcionan acceso a interfaces de bajo nivel de sus productos. Este es un mundo en el que debe usar ASM y C para la comunicación del dispositivo. Un entorno virtual ralentizaría estas partes del programa.

De todos modos, los juegos 3D modernos de hecho usan lenguajes de nivel superior. A menudo, encontrarás la lógica del juego escrita en lenguajes como Lua o Python. Pero el núcleo (E / S, subprocesos, programación de tareas) del típico juego 3D se escribirá en idiomas de bajo nivel durante los próximos 25 años o mientras los dispositivos largos no permitan la abstracción y la virtualización por sí mismos (lo que vendrá).

cafebabe
fuente
1

Estoy de acuerdo con las otras publicaciones sobre el aprovechamiento de elementos de una base de código preexistente / con licencia, rendimiento, etc.

Una cosa que me gustaría agregar es que es difícil sacar trucos desagradables de DRM a través de una máquina virtual.

También creo que hay un componente de arrogancia en el que los gerentes de proyecto creen que pueden crear código estable / confiable con C ++ con todas las ventajas, como tener un control absoluto sobre sus herramientas y recursos, PERO sin todos los aspectos negativos que complican y empantanan a su competencia porque "nosotros" son más inteligentes de lo que son ".

JP772
fuente
0

Runescape by Jagex está escrito en Java, la etiqueta de "videojuego" podría no aplicarse específicamente como un juego en línea, pero tiene un seguimiento decente.

Mark Schultheiss
fuente
Lo siento, pero esto realmente no responde a mi pregunta en absoluto.
Sasha Chedygov
2
Pero la afirmación ciega de la pregunta lleva a la suposición de que NO se escriben juegos en Java, solo señala el caso exitoso de dónde está uno.
Mark Schultheiss
0

Ya se habló mucho de eso, incluso puedes encontrar en Wiki las razones ...

  • C / C ++ para el motor del juego y todas las cosas intensivas.
  • Lua o Python para las secuencias de comandos en el juego.
  • Java: muy, muy mal rendimiento, gran uso de memoria + no está disponible en consolas de juegos (se usa para algunos juegos muy simples (Sí, Runescape cuenta aquí, no es Battlefield o Crysis o qué más hay) simplemente porque hay muchos programadores que conocen este lenguaje de programación).
  • C #: gran uso de memoria (se usa para algunos juegos muy simples solo porque hay prácticamente programadores que conocen este lenguaje de programación).

Y escucho a más y más programadores de Java que intentan convencer a las personas de que Java no es lento, no es lento para dibujar un widget en la pantalla y dibujar algunos caracteres ASCII en el widget, para recibir y enviar datos a través de la red (y es se recomienda usarlo en estos casos (manipulación de datos de red) en lugar de C / C ++) ... Pero es muy lento cuando se trata de cosas serias como cálculos matemáticos, asignación / manipulación de memoria y muchas de estas cosas buenas.

Recuerdo un artículo en el sitio del MIT donde muestran lo que C / C ++ puede hacer si usa las características del lenguaje y del compilador: un multiplicador matricial (2 matrices), 1 implementación en Java y 1 implementación en C / C ++, con características C / C ++ y activadas las optimizaciones del compilador apropiadas, la implementación de C / C ++ fue ~ 296 260 veces más rápida que la implementación de Java.

Espero que entiendas ahora por qué las personas usan C / C ++ en lugar de Java en los juegos, imagina Crysis en Java, no habría ninguna computadora en este mundo que pudiera manejar eso ... + La recolección de basura funciona bien para Widgets que acaban de destruir una imagen pero todavía está almacenado en caché allí y necesita ser limpiado, pero no para juegos, seguro, tendrás aún más retrasos en cada activación de recolección de basura.

Editar : Debido a que alguien solicitó el artículo, aquí, busqué en el archivo web para obtenerlo, espero que esté satisfecho ... Estudio de caso del MIT

Y para agregar, no, Java para juegos sigue siendo una idea horrible. Hace solo unos días, una gran empresa que no nombraré comenzó a reescribir su cliente de juegos de Java a C ++ porque un juego muy simple (en términos de gráficos) estaba retrasado y calentaba las computadoras portátiles i7 con potentes tarjetas de video nVidia GT 5xx y 6xx generación ( no solo nVidia, el punto aquí es que estas poderosas tarjetas que pueden manejar la configuración Max de la mayoría de los juegos nuevos y no pueden manejar este juego) y el consumo de memoria fue ~ 2.5 - 2.6 GB de RAM. Para gráficos tan simples necesita una bestia de máquina.

Lilian A. Moraru
fuente
10
Claramente, sabe muy poco sobre el tiempo de ejecución y la máquina virtual modernos de Java. El artículo que mencionó es más que probable de hace una década o más, por supuesto, nadie puede saberlo porque no lo citó. Su percepción de Java está desactualizada.
bgroenks 01 de
2
De acuerdo, ese estudio demuestra que para la multiplicación de matrices a gran escala, Java pierde a C cuando se usa el acceso de matriz bidimensional para acceder a los datos. Sí, también lo habría adivinado. Y si eso realmente es un problema para usted, lo cual dudo que lo sea, es por eso que tiene JNI. Los límites que verifican la sobrecarga de las matrices se suman en esa situación, aunque su código Java podría haberse optimizado para mejorar significativamente los resultados. Del mismo modo, cuestiono su comprensión de JIT cuando dice: "compilación más rápida = no es el mejor código generado". Ve a leer las especificaciones de IBM para probar lo contrario.
bgroenks
3
Java NO es una mala elección para el desarrollo de juegos. Hay muchos juegos exitosos que ejecutan Java. Por lo general, necesita un poco de ayuda del código nativo (especialmente con LWJGL y demás) para obtener realmente los mejores resultados. Pero si solo tengo que portar y recompilar el 1% de mi código en lugar del 100%, eso me parece una gran oferta.
bgroenks
1
@bgroenks "100%": parece que no tienes idea de C / C ++ ... Y cuando haces un juego siempre puedes usar una biblioteca multiplataforma (SDL y muchos otros) o framework (Qt por ejemplo). Por ejemplo: EA usa Qt para absolutamente todos los juegos que tienen ... Qt es MUCHO más multiplataforma que Java y se compila en código nativo.
Lilian A. Moraru
2
Realmente no veo el punto en Java cuando tienes Qt. El código Qt me parece más claro, más fácil de entender y mantener que el código Java. Cuando les pregunto a mis amigos por qué tienen tanto miedo a C ++, siempre me dicen que odian los punteros y se aseguran de desasignar la memoria. Parece que mucha gente no sabe sobre shared_ptr en C ++ ... Para mí, Qt y C # .NET / C ++ .NET son los mejores para escribir. El código Java generalmente está muy hinchado con manejo de excepciones, por lo general tiene bibliotecas obsoletas (Funciona principalmente solo en el lado del servidor, pero el resto ...) y con frecuencia documentación obsoleta.
Lilian A. Moraru