Java慢速2D性能 - 调整大小

Dav*_*vid 8 java swing 2d jframe

我正在使用Windows 7和Aero,并且有一个非常快的显卡(Radeon 6870),我用它来玩游戏.

调整我使用java制作的非常简单的程序时,我遇到了一些问题.例如,这个程序绝对没有.它没有动作侦听器,没有循环.它只是一个带按钮的GUI界面.

使用OpenGL加速关闭调整大小:

[查看全屏] 缓慢的大小调整

大约需要一秒钟来调整组件的大小.对我来说非常明显.

使用OpenGL加速调整大小:

在此输入图像描述

我试图启用OpenGl加速来解决这个问题.我编译了JAR并运行它java -Dsun.java2d.opengl=true -jar C:\Test.jar.结果是窗口周围的黑色区域略微减少,但更多的是闪烁.实际上,闪烁在上面的屏幕截图中显示为灰色.

问题是否存在于任何其他软件中?

不,Eclipse,Netbeans,Chrome和其他应用程序已经过测试.没有这个问题.因此,我必须得出结论,代码必定存在一些问题.各种各样的人都运行了这段代码并说他们有"没有问题".如果您要测试它,请确保您将窗口从最小尺寸调整到最大尺寸,同时以圆周运动移动鼠标.

码:

import java.awt.*;
import javax.swing.*;

public class JFrameWithButtonsTest {
    private int iScreen = 25;  
    private int iLocation = 10;
    JFrame frame = new JFrame();
    Container contentPane = frame.getContentPane();

    public JFrameWithButtonsTest() {
        JPanel northButtonPanel = new JPanel();
        northButtonPanel.setLayout(new GridLayout(2,2));
        northButtonPanel.add(new JButton(" I do nothing"));
        northButtonPanel.add(new JButton(" I do nothing"));
        northButtonPanel.add(new JButton(" I do nothing"));
        northButtonPanel.add(new JButton(" I do nothing"));
        contentPane.add(northButtonPanel, BorderLayout.NORTH);

        JPanel southButtonPanel = new JPanel();
        southButtonPanel.setLayout(new GridLayout(2,2));
        southButtonPanel.add(new JButton(" I do nothing"));
        southButtonPanel.add(new JButton(" I do nothing"));
        southButtonPanel.add(new JButton(" I do nothing"));
        southButtonPanel.add(new JButton(" I do nothing"));
        contentPane.add(southButtonPanel, BorderLayout.SOUTH);

        JPanel eastButtonPanel = new JPanel();
        eastButtonPanel.setLayout(new GridLayout(2,2));
        eastButtonPanel.add(new JButton(" I do nothing"));
        eastButtonPanel.add(new JButton(" I do nothing"));
        eastButtonPanel.add(new JButton(" I do nothing"));
        eastButtonPanel.add(new JButton(" I do nothing"));
        contentPane.add(eastButtonPanel, BorderLayout.EAST);

        boolean packFrame = false;
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        Dimension frameSize = frame.getSize();
        frameSize.height = (int) (iScreen * screenSize.height / 100);
        frameSize.width = (int) (iScreen * screenSize.width / 100);
        frame.setSize(frameSize);
        frame.setLocation((screenSize.width - frameSize.width) / iLocation,
                (screenSize.height - frameSize.height) / iLocation);
        if (packFrame) {
            frame.pack();
            packFrame = true;
        } else {
            frame.validate();
        }
        frame.setVisible(true);
    }
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {
            e.printStackTrace();
        }
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new JFrameWithButtonsTest();
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果没有此行,问题仍然存在: UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

小智 5

我开始注意到我最近的两个Java程序.

我查看了NetBeans的配置文件,发现以下内容会改善这种情况:

  public static void main(final String... args) {
    System.setProperty("sun.java2d.noddraw", Boolean.TRUE.toString());
    ...
Run Code Online (Sandbox Code Playgroud)

-Dsun.java2d.noddraw=true与JVM命令行上的相同.