为什么与(快速)专用GPU相比,(缓慢的)集成GPU上的Java2D速度更快?

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。所以要注意两件事:

  • 旧笔记本电脑上的Java2D运行速度与OpenGL实现一样快
  • 我10岁的笔记本电脑使用专用GPU的性能要比台式机好一个数量级!

我曾经而且现在仍然不知所措,并且正在思考潜在的原因。两台计算机上的JRE版本均已关闭(1.8.1xx),它们运行的​​操作系统相同(Windows 8.1)。我也绝对确定,Java没有通过将“ -Dsun.java2d.opengl = false”传递给JVM而没有使用硬件加速,没有任何影响。

因此,我认为笔记本电脑的iGPU可以从内存连接方式中受益匪浅,这或许与某些事实有关。为了验证我的假设,我还配置了台式机使其在iGPU(HD Graphics 2500)上运行。结果是,在激活iGPU的情况下,同一基准测试在我的桌面上执行的时间约为7毫秒。

虽然我找到了为什么笔记本电脑比台式机更快的原因,但我仍然不明白...

  • 有人可以向我解释一下,为什么在这种情况下Java2D在iGPU上这么快吗?
  • 将价值约4MB的UI(就原始像素数据而言)传输到专用GPU的速度不应该超过290ms吗?
  • 这是Java2D中的(性能)错误吗?

编辑:我当时在想,也许iGPU的假设仍然是错误的,这是AMD / ATI的问题...因此,如果有人以不同的结果或在NVIDIA GPU上运行基准测试,共享结果将不胜感激:)