Wol*_*olf 5 java graphics performance gpu java-2d
我试图通过从Java2D切换到OpenGL(LWJGL)来优化应用程序的性能。我为自己编写了一些基准测试,以了解这两者之间的性能差异,并一开始对结果感到满意。但是,当我在另一台计算机上运行基准测试时,结果令我震惊。
这是有问题的基准:
public static void main(String[] args) throws InterruptedException {
//create window
JFrame frame = new JFrame();
frame.setSize(1000, 1000);
frame.setLocation(0, 0);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//add drawable component
frame.add(new JComponent() {
protected void paintComponent(Graphics graphics) {
Graphics2D g = (Graphics2D) graphics;
g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g.setFont(g.getFont().deriveFont(24f));
long start = System.nanoTime();
for(int i=0;i<500;i++){
g.drawString("This is a test string - This is a test string - This is a test string",10, 20+i*2);
}
long end = System.nanoTime();
long nsDuration = (end-start);
System.out.println("DrawString takes: "+(nsDuration/1_000_000)+" ms");
}});
frame.setVisible(true);
boolean t=true;
while(t){
frame.repaint();
Thread.sleep(1000);
}
}
Run Code Online (Sandbox Code Playgroud)
我在台式计算机(CPU:i3-3220,GPU:HD7850)上开发了它,并在其中获得了以下输出:
抽绳所需时间:281毫秒
DrawString需要299毫秒
DrawString需要282毫秒
基准测试的OpenGL版本给了我大约4毫秒的时间,因此性能提高了约75倍,这似乎不错。
当我在10岁或更弱的笔记本电脑(CPU:P8600,GPU:Intel GMA 4500MHD)上运行基准测试时,OpenGL版本和Java2D版本的结果约为20ms。所以要注意两件事:
我曾经而且现在仍然不知所措,并且正在思考潜在的原因。两台计算机上的JRE版本均已关闭(1.8.1xx),它们运行的操作系统相同(Windows 8.1)。我也绝对确定,Java没有通过将“ -Dsun.java2d.opengl = false”传递给JVM而没有使用硬件加速,没有任何影响。
因此,我认为笔记本电脑的iGPU可以从内存连接方式中受益匪浅,这或许与某些事实有关。为了验证我的假设,我还配置了台式机使其在iGPU(HD Graphics 2500)上运行。结果是,在激活iGPU的情况下,同一基准测试在我的桌面上执行的时间约为7毫秒。
虽然我找到了为什么笔记本电脑比台式机更快的原因,但我仍然不明白...
编辑:我当时在想,也许iGPU的假设仍然是错误的,这是AMD / ATI的问题...因此,如果有人以不同的结果或在NVIDIA GPU上运行基准测试,共享结果将不胜感激:)