primeira chamada ao construtor JFrame leva muito tempo durante a inicialização do aplicativo Swing (por causa de java.awt.Window ())
Estou tentando criar um aplicativo simples, leve e responsivo usando o Java Swing. Quando é iniciado, no entanto, há um atraso perceptível (> 500ms) antes da janela (um JFrame) aparece
Eu o localizei até o construtor da classe java.awt.Window, que é um ancestral do JFram
Estranhamente, o construtor é lento apenas para a primeira chamada. Se eu criar vários objetos JFrame, o tempo gasto no construtor é de ~ 600ms para o primeiro objeto, mas normalmente é medido como 0ms para objetos subsequente
Aqui está um exemplo simples que, no meu sistema, mostra esse atraso significativo na primeira chamada do construtor, mas não na 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.");
}
});
}
Com saída típica:
641 for first JFrame.
0 for second JFrame.
Se eu adicionar esta inicialização do objeto Window antes dos objetos JFrame:
java.awt.Window window = new java.awt.Window(null);
Então a saída muda para algo como:
578 for first Window.
47 for first JFrame.
0 for second JFrame.
Quando tento o mesmo com a superclasse de Window, java.awt.Container, o construtor Window ainda é o que leva muito tempo para ser executado (para que o problema não ultrapasse a classe Window
Desde que o construtor JFrame chama o construtor Window, o acima parece indicar que a primeira chamada para o construtor Window é car
O que acontece na primeira chamada ao construtor que demora tanto tempo e há algo que eu possa fazer sobre isso? Existe alguma correção simples ou o problema é fundamental para o Swing / AWT? Ou talvez seja um problema específico do meu sistema / instalação?
Gostaria que meu aplicativo fosse aberto tão rápido (ou quase tão rápido) quanto o MS Notepad e, enquanto eu puder imprimir o texto no console na mesma hora em que o Notepad for aberto (se eu colocar o código antes da primeira inicialização do JFrame), o problema acima significa que há quase um segundo inteiro de atraso antes que a janela seja visível. Vou precisar usar uma linguagem ou estrutura de GUI diferente para obter o desempenho que estou procurando?
Edita: Se eu adicionar Thread.sleep (10000) como a primeira linha de execução (), os resultados não serão alterados (eles aparecerão 10 segundos depois). Isso sugere que o problema não é causado por algum código de inicialização assíncrono, mas é acionado diretamente pela chamada do construto
Edit 2: Percebeu que o NetBeans Profiler pode criar um perfil dentro das classes JRE e descobriu que na maioria das vezes é gasto inicializando um objeto sun.java2d.d3d.D3DGraphicsDevice (o objeto Window precisa de limites e inserções de tela), que faz parte do "Direct3D Pipeline de renderização acelerada para plataformas Microsoft Windows, ativado por padrão ", introduzido emJava 6u10. Ele pode ser desativado passando a propriedade "-Dsun.java2d.d3d = false" para a JVM, o que reduz o tempo de inicialização em cerca de 3/4, mas ainda não tenho certeza se vou precisar (D3D) ou se houver outra maneira de fazer o carregamento mais rápido. Aqui está a saída se eu colocar esse parâmetro na linha de comando:
0 for first Window
47 for first JFrame.
0 for second JFrame.
Voltarei e limpo este post depois que eu me aprofundar mais tarde.