La primera llamada al constructor JFrame tarda mucho tiempo durante el inicio de la aplicación Swing (debido a java.awt.Window ())
Estoy tratando de crear una aplicación simple, ligera y receptiva utilizando Java Swing. Sin embargo, cuando se inicia, hay un retraso notable (> 500 ms) antes de que aparezca la ventana (un JFrame).
Lo he rastreado hasta el constructor de la clase java.awt.Window, que es un antepasado de JFrame.
Oddly, el constructor solo es lento para la primera llamada. Si creo varios objetos JFrame, el tiempo que pasé en el constructor es de ~ 600 ms para el primer objeto, pero generalmente se mide como 0 ms para los objetos posteriores.
Aquí hay un ejemplo simple que, en mi sistema, muestra este retraso significativo para la primera llamada del constructor pero no la segunda:
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
long start;
start = System.currentTimeMillis();
JFrame frame1 = new JFrame();
System.out.println((System.currentTimeMillis() - start) + " for first JFrame.");
start = System.currentTimeMillis();
JFrame frame2 = new JFrame();
System.out.println((System.currentTimeMillis() - start) + " for second JFrame.");
}
});
}
Con salida típica:
641 for first JFrame.
0 for second JFrame.
Si agrego esta inicialización de objeto Window antes de los objetos JFrame:
java.awt.Window window = new java.awt.Window(null);
Entonces la salida cambia a algo como:
578 for first Window.
47 for first JFrame.
0 for second JFrame.
Cuando intento lo mismo con la superclase de Window, java.awt.Container, el constructor de Windows sigue siendo el que tarda mucho tiempo en ejecutarse (por lo que el problema no supera la clase Window).
Dado que el constructor JFrame llama al constructor de Windows, lo anterior parece indicar que la primera llamada al constructor de Windows es costosa.
¿Qué sucede en la primera llamada al constructor que lleva tanto tiempo y hay algo que pueda hacer al respecto? ¿Hay alguna solución simple o el problema es fundamental para Swing / AWT? ¿O quizás es un problema específico de mi sistema / configuración?
Me gustaría que mi aplicación se abra tan rápido (o casi tan rápido) como el Bloc de notas de MS y, si bien puedo imprimir el texto en la consola cuando se abre el Bloc de notas (si pongo el código antes de la primera inicialización de JFrame) El problema anterior significa que hay casi un segundo de retraso antes de que la ventana sea visible. ¿Tendré que usar un lenguaje diferente o un marco GUI para obtener el rendimiento que busco?
Edita: Si agrego Thread.sleep (10000) como la primera línea de ejecución (), los resultados no cambian (solo aparecen 10 segundos después). Esto sugiere que el problema no es causado por algún código de inicio asíncrono, sino que se desencadena directamente por la llamada del constructor.
Edit 2: Se dio cuenta de que NetBeans Profiler puede perfilar dentro de las clases JRE y descubrió que la mayor parte del tiempo se gasta inicializando un objeto sun.java2d.d3d.D3DGraphicsDevice (el objeto Window necesita límites de pantalla e inserciones), que forma parte de un "Direct3D Canalización de renderización acelerada para plataformas Microsoft Windows, habilitada de forma predeterminada ", presentada enJava 6u10. Se puede deshabilitar pasando la propiedad "-Dsun.java2d.d3d = false" a la JVM, lo que reduce el tiempo de inicio en aproximadamente 3/4, pero aún no estoy seguro de si lo necesitaré (D3D) o si hay alguna otra forma de hacer que se cargue más rápido. Aquí está la salida si pongo ese parámetro en la línea de comando:
0 for first Window
47 for first JFrame.
0 for second JFrame.
Volveré y limpiaré esta publicación después de profundizar más tarde.