Java的AWT drawString之初期()调用需要长时间

问题描述 投票:-1回答:2

我遇到的问题是很简单的,我用Java AWT(和Swing),使一个游戏,但最初Graphics.drawString(String str, int x, int y)调用需要的时间太长了。我不设置自定义字体或任何东西。我没有设置任何渲染提示。我在使用Mac塞拉利昂10.12.4一台MacBook Air,我没能测试我在Windows程序呢。如果该事项在所有。

如果你不想花时间阅读的小例子,我有一个名为的GamePanel类扩展JPanel(和实现Runnable),我的主要方法添加到一个JFrame。我初始化游戏线程在构造函数中,并开始在run()方法的游戏循环。那么游戏循环使用的Swing计时器会重演。在游戏循环,我叫paintComponent(Graphics g)通过redraw(),文字的paintComponent方法得出。这是不是真的有必要信息,因为这个问题是没有可重复性游戏循环,只是游戏线程和paintComponent方法,但我把这个在这里只是柜面。

任何帮助表示赞赏。

游戏类(JFrame的)

public class Game {
    public static JFrame frame;
    public static JPanel gamePanel;

    public static void main(String[] args) {
        frame = new JFrame("");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        frame.setLayout(new BorderLayout());
        gamePanel = new GamePanel();
        frame.add(gamePanel, BorderLayout.CENTER);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

的GamePanel类(图)

public class GamePanel() extends JPanel implements Runnable {
    public static Thread thread;

    public GamePanel() {
        super();

        setPreferredSize(new Dimension(640, 480));

        setFocusable(true);
        requestFocus();

        if (thread == null) {
            thread = new Thread(this);
            thread.start();
        }
    }

    public void run() {
        while (! Game.frame.isVisible()) {
            try {
                Thread.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        EventQueue.invokeLater(new Runnable() {
            public void run() {gameLoop();}
        });
    }

    public void GameLoop() {
        repaint();

        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        gameLoop();
    }

    public void paintComponent(Graphics g) {
        super.paintComponent();
        g.drawText("Hello World", 10, 10);
    }
}

我知道在小例子的速度的游戏循环会不断变化(与那正是一个良好的游戏循环应该做的正好相反)。但又有什么关系中一个最小的例子吗?

java macos swing edit lag
2个回答
1
投票

我有同样的问题。我的解决方案是拯救我的资源文件夹使用的字体,然后加载字体。在您文摘通过“新建/源文件夹”最容易创建一个文件夹。文件夹的名称,如果你按照我的例子没关系。我说我已经保存在资源文件夹的字体被称为“DroidSans-Bold.ttf”

    Font font = null;

    try {
       font = Font.createFont(Font.TRUETYPE_FONT, new File(getClass().getResource("/DroidSans-Bold.ttf").getFile()));
       font = font.deriveFont(32f); // Set size to 32
    } catch (FontFormatException | IOException e) {
       e.printStackTrace();
    }

    JFrame jf = new JFrame();
    jf.setSize(800, 600);
    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    jf.setVisible(true);

    Graphics2D g = (Graphics2D)jf.getGraphics();

    g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
    g.setFont(font);
    g.drawString("Hello", 100, 100);

3
投票

这是因为你打电话从不同的线程重绘。你可以阅读有关事件指派线程。

Java Event-Dispatching Thread explanation

https://docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html

© www.soinside.com 2019 - 2024. All rights reserved.