usar titledborder setborder create codigo java

setborder - titledborder java



¿Por qué solo unos pocos videojuegos están escritos en Java? (22)

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

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


  1. Java es lento, la mayor parte del trabajo pesado no es manejado por la GPU. Todavía hay animación, física y AI golpeando la CPU, todo lo cual consume mucho tiempo.

  2. Java no existe en las consolas, y las consolas son un objetivo principal para los juegos comerciales. Si usa Java en la PC, está eliminando su capacidad de transferir a las consolas dentro de un tiempo y un 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 codificadores profesionales de juegos simplemente no conozcan muy bien Java.

  4. El punto de otra persona sobre el middleware anterior era bueno, así que lo estoy agregando a mi respuesta. Hay una gran cantidad de código heredado y middleware escrito específicamente para vincular con C / C ++, y la última vez que revisé Java no tiene una buena interoperabilidad. Usar Java para la mayoría de las compañías implicaría arrojar una gran cantidad de código, gran parte del cual ha sido pagado de una manera u otra.


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

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


Conceptos erróneos sobre el rendimiento y las malas optimizaciones de JVM serían mi suposición. Digo conceptos erróneos sobre el rendimiento porque hay algunos puertos de Java de juegos de C ++ que funcionan más rápido que sus contrapartes de 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 punta como lo son con la facilidad de uso y la comprensibilidad / mantenimiento del código. En el lado C / C ++ de las cosas, esencialmente estás codificando en un lenguaje ensamblador de un nivel ligeramente superior y está lo más cerca posible del hardware sin escribir en ensamblador o código máquina directo.


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


Creo que John Carmack lo dijo mejor con:

El mayor problema es que Java es muy lento. En un nivel puro de CPU / memoria / pantalla / comunicaciones, 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 se queda con la potencia de la CPU de una PC IBM original de 4,77 mhz y un pésimo control sobre todo. [... snip ...] Write-once-run-anywhere. Decir ah. Hahahahaha. Solo estamos probando en cuatro plataformas en este momento, y ni un solo par tiene las mismas peculiaridades. Todos los juegos comerciales son retocados y compilados individualmente para cada plataforma (a menudo más de 100). La portabilidad no es una justificación para el desempeño horrible.

( source )

De acuerdo, él estaba hablando de plataformas móviles, pero he encontrado problemas similares con Java como un todo proveniente de un fondo de C ++. Extraño poder asignar memoria en el Stack / Heap en mis propios términos.


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 tanto incentivo para cambiar a .NET / Java / cualquier cosa que no sea C / C ++.

La mayoría de las compañías de juegos licencian partes del motor del juego de otras compañías. Estas partes están escritas en C ++, y aunque puede que tengas acceso a la fuente para poder portarla, eso requiere un gran esfuerzo (y, por supuesto, la licencia debe permitirse).

Además, ya existe mucho 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 seguir con el mismo idioma, en lugar de reescribirlo en un nuevo idioma (más aún porque es probable que vuelva a introducir un montón de errores que necesitará pasar el tiempo de planchado.

Finalmente, es raro que los juegos se escriban en C ++ al 100% de todos modos. Mucho se hace usando lenguajes de scripting, ya sea que sean personalizados o simplemente que integren un idioma existente (Lua es uno de los más populares actualmente).

En lo que respecta a la recolección de basura, eso puede ser un problema. El problema no es tanto que exista, sino más bien cómo funciona: el recolector de basura DEBE no bloquear (o al menos se garantiza que bloqueará muy brevemente), ya que es simplemente inaceptable congelar el juego durante 10 segundos mientras escanea toda la memoria asignada para ver qué se puede liberar. Sé que Java tiende a ahogarse un poco en GCing cuando está a punto 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 por completo el hardware debido a la sobrecarga del tiempo de ejecución. Imagine Crysis escrito en Java ... incluso si esa es la única diferencia visible, simplemente no sería lo mismo (también estoy bastante seguro de que necesitaría un Core i7 para ejecutarlo).

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

En lo que respecta a los juegos comerciales, ¿cuenta RuneScape ? Ese puede ser el juego Java más exitoso que hay.


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

Seguro que puede haber algunos juegos .NET (¿a cuáles? Estoy interesado. ¿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 eliminar las tecnologías y bibliotecas exclusivas de Windows, como DirectX.


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

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

Desafortunadamente, en el lado de Java, falta mucho, principalmente porque 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?


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

Una cosa que me gustaría añadir 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 hubris donde los gerentes de proyectos piensan que pueden crear código estable / confiable con C ++ con todas las ventajas como tener control absoluto sobre sus herramientas y recursos, PERO sin todos los negativos que complican y atascan a su competencia porque "nosotros" son más inteligentes de lo que son ".


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


Game Marketing es un proceso comercial; los editores quieren rendimientos cuantificables de bajo riesgo de su inversión. Como consecuencia, la atención se centra generalmente en los trucos tecnológicos (con excepciones) que los consumidores comprarán para producir un rendimiento confiable: estos tienden a ser efectos visuales superficiales como el resplandor de la lente o una resolución más alta. Estos efectos son confiables porque simplemente usan aumentos en la potencia de procesamiento: explotan el hardware / aumenta la ley de Moore. esto implica el uso de C / C ++: java suele estar demasiado abstraído del hardware para explotar estos beneficios.


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 idiomas como Lua o Python. Pero el núcleo (E / S, hilos, programación de tareas) del típico juego 3D se escribirá en lenguajes de bajo nivel durante los próximos 25 años o mientras los dispositivos no permitan la abstracción y la virtualización por sí mismos (lo que vendrá).


Por un lado, la falta de sobrecarga del operador de Java hace que todas las operaciones matemáticas con las que se tiene que lidiar se vuelvan muy, muy molestas y difíciles de leer.

Toda la multiplicación matricial y los vectores afines con los que debe lidiar 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í.


Puede preguntar por qué las aplicaciones web no están escritas en C o C ++, también. El poder de Java radica en su diseño de pila de red y orientado a objetos. Por supuesto, C y C ++ también tienen eso. Pero en una abstracción inferior. 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á atrapado con la API de cualquier marco.


Puntos menores primero:

  • cualquier aumento de productividad de Java es hipotético. La sintaxis es casi idéntica a C ++, por lo que realmente solo está aprovechando 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 la memoria es un tema polémico debido a la recolección de basura.

  • multiplataforma "gratis" no es tan bueno como piensas porque pocos desarrolladores quieren usar OpenGL y varias plataformas clave probablemente carecen de una buena implementación 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 movieron a C ++ desde C y hacia C desde el ensamblaje solo porque la ruta de migración fue fluida. Cada uno interactúa estrechamente con el anterior, y todo su código anterior se podía utilizar en el nuevo idioma, a menudo a través de un único compilador. Por lo tanto, la migración fue tan lenta o tan rápida como quisiste. Por ejemplo, algunos de nuestros viejos encabezados actualmente en uso todavía tienen #ifdef WATCOMC , y no creo que nadie haya usado el compilador Watcom aquí en una década o más. Hay una gran inversión en código antiguo y cada bit solo se reemplaza según sea necesario. Ese proceso de reemplazar y actualizar bits y piezas de un juego al siguiente no es ni mucho menos práctico si cambiaste a un idioma que no interopera de forma nativa con tu código existente. Sí, la interoperabilidad C ++ / Java es posible, pero muy poco práctica en comparación con simplemente escribir "C con un poco de C ++" o incrustando bloques de ASM en C.

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

  1. Ser 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 lo suficiente de un impulso de productividad que el costo de reescribir todo tu propio código (o la reelaboración de las interfaces en componentes reutilizables que se pueden utilizar desde ese idioma) está más que cubierto.

Subjetivamente, no creo que Java se encuentre 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 que se puede utilizar, pero que utiliza un tenedor del idioma principal de Python, muchos componentes de C ++ para el rendimiento, e incluso eso es para un juego bastante poco exigente en términos modernos).


Runescape de 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.


Supongo que la velocidad sigue siendo el problema. La plataforma cruzada va a ser un problema, ¿no es así porque 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 migración de un juego entre wii, xbox y ps3, pero voy a apostar caro.

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


Una de las principales razones por las que Java y otros lenguajes de máquinas virtuales no se utilizan para 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 hacer la recolección de basura, necesitas 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 se deben ejecutar en un momento específico, es difícil tener una tarea automatizada como la recolección de basura.

No es que Java sea lento. Es que Java no es bueno en el manejo de tareas en tiempo real.


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

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


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

  • C / C ++ para el motor del juego y todas las cosas intensivas.
  • Lua o Python para crear scripts en el juego.
  • Java: muy, muy mal rendimiento, gran uso de memoria + no está disponible en las consolas de juegos (se usa para algunos juegos muy simples (sí, Runescape cuenta aquí, no es Battlefield o Crysis o qué más hay) solo 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 muchos programadores que conocen este lenguaje de programación).

Y cada vez escucho más programadores de Java que intentan convencer a la gente 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 de memoria / manipulación y muchas de estas cosas buenas.

Recuerdo un artículo en el sitio MIT donde muestran lo que C / C ++ puede hacer si usa las características de lenguaje y compilador: un multiplicador matricial (2 matrices), 1 implementación en Java y 1 implementación en C / C ++, con características C / C ++ y las optimizaciones apropiadas del compilador activadas, 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 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 acaba de destruir una imagen pero todavía está en la memoria caché y necesita ser limpiado, pero no para juegos, de seguro, tendrá aún más retrasos en cada activación de recolección de basura.

Editar : Porque alguien pidió el artículo, aquí, busqué en el archivo web para obtenerlo, espero que esté satisfecho ... Estudio de caso 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) retrasaba y calentaba las laptops i7 con poderosas tarjetas de video de generación nVidia GT 5xx y 6xx ( no solo nVidia, el punto aquí es que esta poderosa tarjeta puede manejar la configuración máxima de la mayoría de los juegos nuevos y no puede manejar este juego) y el consumo de memoria fue de ~ 2.5 - 2.6 GB de RAM. Para gráficos tan simples, necesita una bestia de una máquina.


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, podrá acceder a ejemplos de juegos y demos escritos en Java. Aquí hay un par:

Para ciertos juegos y situaciones, las compensaciones de Java podrían ser aceptables.


  • ¿Hay buenos puertos para los motores de juegos / 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 ha sido vendido a las empresas debido a su tipado sólido y tiene la percepción de no tener problemas de administración de memoria.
  • Y sí, Java todavía sufre de una percepción de que es lenta, y la gestión de la memoria es pobre, y para los juegos, probablemente no se adapta bien a la tarea. Como se indica en algunas de las otras respuestas, la recolección de basura simplemente no va a disminuir cuando se trata de requisitos de alto rendimiento en tiempo real. Los videojuegos empujan las CPU y GPU a sus límites.