在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();
}
}
}
答案 0 :(得分:1)
你有一个无限循环,将继续重新绘制图像。
你不应该使用getGraphics()并使用该Graphics对象进行绘画,因为绘画不是永久性的。
自定义绘制是通过覆盖JPanel的paintComponent()
方法完成的,然后使用传递给该方法的Graphics对象。
阅读Custom Painting上Swing教程中的部分,了解更多信息和示例。
要安排动画,您可以使用Swing Timer。