我试图通过从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);
}
}
我是在台式电脑上开发的(CPU:i3-3220,GPU:HD7850),我得到这样的输出:
DrawString需要:281毫秒
DrawString需要:299 ms
DrawString需要:282 ms
基准测试的OpenGL版本给了我大约4ms的时间,所以性能提高了约75倍,这似乎很好。
当我在我10岁的笔记本电脑(CPU:P8600,GPU:Intel GMA 4500MHD)上运行基准测试时,OpenGL版本和Java2D版本的结果大约是20ms左右。所以有两点需要注意:
我当时仍然不知所措,并且正在考虑潜在的原因。两台机器上的JRE版本都很接近(1.8.1xx),它们运行相同的操作系统(Windows 8.1)。我也绝对肯定,Java并没有通过传递&#34; -Dsun.java2d.opengl = false&#34;来使用硬件加速。到JVM没有任何影响。
所以我认为,也许是因为笔记本电脑的iGPU以某种方式从内存方式的连接中获益。为了测试我的假设,我还将桌面配置为在iGPU(HD Graphics 2500)上运行。结果是在我的桌面上执行了相同的基准测试,在iGPU激活的情况下执行了大约7毫秒。
虽然我找到了为什么我的笔记本电脑比我的桌面更快的原因,但我仍然不理解它......