OS X上的Java Graphics drawImage方法非常慢

时间:2015-03-12 14:55:01

标签: java awt

drawImage(image, x, y, null);课程中Graphics对象上使用的JPanel方法需要很长时间才能完成并以低FPS运行游戏,特别是在MacBook Pro上已经过测试on - Linux机器似乎运行得很好。所需的时间受图像大小的影响很大。我在网上发现的一些潜在修复措施没有帮助,例如: Graphics.drawImage() in Java is EXTREMELY slow on some computers yet much faster on others并且建议使用不同版本的Java并没有太大的区别 - 我尝试了Java 6和8,因为有人建议这有时是由于Java 7+版本。

经过几个小时的搜索,我决定尝试创建一个全新的项目,该项目实现了在循环中运行此方法的基础知识,下面是代码 - 如果我在做一些愚蠢的事情!

设置JFrame的类:

import javax.swing.JFrame;

public class Main {

    public static void main(String args[]) {

        JFrame f = new JFrame("Carnival Carnage");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setContentPane(new TPanel());
        f.pack();
        f.setVisible(true);

    }

}

扩展JPanel的类:

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;

import javax.swing.JPanel;

public class TPanel extends JPanel implements Runnable {

    private Graphics g;
    private BufferedImage image;
    private Thread thread;
    private int width = 1600, height = 900;

    public TPanel() {
        super();
        setPreferredSize(new Dimension(width,height));

        image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

        setFocusable(true);
        requestFocus();
    }

    private void draw() {
        g = getGraphics();
            long start = System.nanoTime();
        g.drawImage(image, 0, 0, null);
            System.out.println(System.nanoTime() - start);
    }

    public void run() {
        while(true) {
            draw();
        }
    }

    public void addNotify(){
        super.addNotify();
        if(thread == null) {
            thread = new Thread(this);
            thread.start();
        }
    }

}

1 个答案:

答案 0 :(得分:1)

你有一个无限循环,将继续重新绘制图像。

你不应该使用getGraphics()并使用该Graphics对象进行绘画,因为绘画不是永久性的。

自定义绘制是通过覆盖JPanel的paintComponent()方法完成的,然后使用传递给该方法的Graphics对象。

阅读Custom Painting上Swing教程中的部分,了解更多信息和示例。

要安排动画,您可以使用Swing Timer