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

时间:2018-03-16 15:56:19

标签: java performance graphics 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);
    }
}

我是在台式电脑上开发的(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左右。所以有两点需要注意:

  • 旧笔记本电脑上的Java2D和我的OpenGL实现一样快
  • 我10岁的笔记本电脑跑得超过我的台式机专用GPU超过一个数量级!

我当时仍然不知所措,并且正在考虑潜在的原因。两台机器上的JRE版本都很接近(1.8.1xx),它们运行相同的操作系统(Windows 8.1)。我也绝对肯定,Java并没有通过传递&#34; -Dsun.java2d.opengl = false&#34;来使用硬件加速。到JVM没有任何影响。

所以我认为,也许是因为笔记本电脑的iGPU以某种方式从内存方式的连接中获益。为了测试我的假设,我还将桌面配置为在iGPU(HD Graphics 2500)上运行。结果是在我的桌面上执行了相同的基准测试,在iGPU激活的情况下执行了大约7毫秒。

虽然我找到了为什么我的笔记本电脑比我的桌面更快的原因,但我仍然不理解它......

  • 有人可以向我解释一下,为什么在这种情况下,Java2D在iGPU上的速度要快得多?
  • 不应该将大约4MB的UI(就原始像素数据而言)传输到专用GPU的速度超过290毫秒吗?
  • 这是Java2D中的(性能)错误吗?
编辑:我在想,也许iGPU假设仍然是错误的,这是AMD / ATI的一个问题......所以,如果有人运行不同结果的基准测试或NVIDIA GPU,共享结果将是赞赏:))

0 个答案:

没有答案