Java游戏落后了

Java游戏落后了,java,swing,animation,timer,lag,Java,Swing,Animation,Timer,Lag,我正在编写一个小行星小游戏,但它似乎有点落后。我正在使用swing.Timer更新JFrame并显示图形。我有两个问题, 第一个是: “计时器可能是延迟的原因吗?”第二个原因是: “使用计时器是处理Java游戏编程的最佳方式,还是不是?” 浏览网络时,似乎每个人都在使用计时器来处理动画,但我忍不住觉得这是一种次优的方式。有人能给我解释一下吗?提前感谢:) 这是我计时器的代码,如果有帮助的话。首先是基类: 导入java.awt.Color; 导入java.awt.Dimension; 导入jav

我正在编写一个小行星小游戏,但它似乎有点落后。我正在使用
swing.Timer
更新JFrame并显示图形。我有两个问题, 第一个是:

“计时器可能是延迟的原因吗?”第二个原因是:

“使用计时器是处理Java游戏编程的最佳方式,还是不是?”

浏览网络时,似乎每个人都在使用计时器来处理动画,但我忍不住觉得这是一种次优的方式。有人能给我解释一下吗?提前感谢:)

这是我计时器的代码,如果有帮助的话。首先是基类:


导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.Graphics2D;
导入java.awt.GridBagConstraints;
导入java.awt.GridBagLayout;
导入java.awt.Insets;
导入java.awt.Toolkit;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.image.buffereImage;
导入javax.swing.*;
公共类基类实现ActionListener{
//属性
受保护的静态int cd=3;//以秒为单位的倒计时长度
private int nrOfAsteroids=10;//产生的小行星数量
受保护的静态int fps=60;//每秒帧数
//各种变量和常数
受保护的静态缓冲图像;
受保护的静态内部高度;
受保护的静态整数宽度;
受保护的静态布尔颜色模式=false;
//密钥寄存器所需的变量
受保护的静态布尔值isWpressed=false;
私有布尔值isQpressed=false;
private boolean isEpressed=false;
私有布尔值isSpacePressed=false;
private boolean stop=false;//游戏结束后要删除的TODO
//各种复杂对象
私有静态基b=新基();
私人小行星[]a=新小行星[N];
私有JFrame;
私人按钮启动;
私有JButton彩色按钮;
私用JLabel假人;
私人JLabel游戏标签;
受保护的静态JLabel屏幕=新的JLabel();
私人图像图标;
私人定时器t;
私有静态维度screenSize=Toolkit.getDefaultToolkit().getScreenSize();
公共静态void main(字符串[]args){
高度=(整数)(屏幕大小.高度*0.9);
宽度=(int)(屏幕大小.width*0.9);
图像=新的BuffereImage(宽度、高度、BuffereImage.TYPE_INT_ARGB);
屏幕设置尺寸(宽度、高度);
b、 框架设置();
}//末端总管
私有void frameSetup(){
//帧设置
frame=新JFrame(“Yaaassss痔疮”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setBackground(颜色:黑色);
框架立根((int)(屏幕尺寸.宽度*0.05),(int)(屏幕尺寸.高度*0.03),宽度,高度);
frame.setLayout(新的GridBagLayout());
//创建“颜色”按钮
colorButton=新的JButton(“经典”);
GridBagConstraints cb=新的GridBagConstraints();
cb.weightx=1;
cb.weighty=1;
cb.gridx=2;
cb.gridy=0;
cb.anchor=GridBagConstraints.FIRST_LINE_END;
cb.插图=新插图(10,0,0,10);
colorButton.setPreferredSize(新尺寸(100,30));
添加框架(颜色按钮,cb);
//创建“小行星”标签
gameLabel=新的JLabel(“ASSTEROIDS”);
GridBagConstraints gl=新的GridBagConstraints();
gl.weightx=1;
gl.weighty=1;
gl.gridwidth=3;
gl.gridx=0;
gl.gridy=1;
gl.anchor=GridBagConstraints.CENTER;
gl.fill=GridBagConstraints.BOTH;
gameLabel.setPreferredSize(新维度(100,30));
gameLabel.setFont(gameLabel.getFont().deriveFont(60.0f));
gameLabel.setForeground(颜色:白色);
gameLabel.setHorizontalAlignment(SwingConstants.CENTER);
帧。添加(游戏标签,gl);
//虚拟组件
dummy=新的JLabel();
GridBagConstraints dc=新的GridBagConstraints();
虚拟。设置首选尺寸(新尺寸(100,30));
dc.weightx=1;
dc.weighty=1;
dc.gridx=0;
dc.gridy=0;
帧。添加(虚拟,dc);
//创建“开始”按钮
开始=新的JButton(“开始”);
GridBagConstraints sb=新的GridBagConstraints();
sb.x=1;
sb.weight=1;
sb.gridx=1;
sb.gridy=2;
sb.anchor=gridbagstraints.PAGE_START;
sb插图=新插图(15,0,0,0);
start.setPreferredSize(新维度(100,30));
添加(开始,sb);
//为按钮实现一个功能
start.addActionListener(this);
addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
if(colorButton.getText()=“CLASSIC”){
颜色模式=真;
colorButton.setText(“LSD-TRIP”);
}否则{
颜色模式=假;
colorButton.setText(“经典”);
}
}
});
//显示结果
frame.setVisible(true);
}
私有void addImage(){
//实现映像
图标=新图像图标(图像);
屏幕设置图标(图标);
帧。添加(屏幕);
}
受保护的void setWindowsSize(){
宽度=frame.getBounds().width;
高度=frame.getBounds().height;
屏幕设置尺寸(宽度、高度);
}
@凌驾
已执行的公共无效行动(行动事件ae){
//清洁屏幕
框架。移除(开始);
框架。移除(游戏标签);
框架。移除(彩色按钮);
框架。移除(虚拟);
//检查窗口是否已调整大小,并根据其进行操作
setWindowsSize();
//创建图像
用于(int i)=
long time = System.nanoTime();

while(!gameOver) {
    long nTime = System.nanoTime();
    float diff = (nTime - time) * 0.000000001f;

    if(diff > 1.0f / fps) {
        time = nTime;

        // do rendering here and multiply any speeds or accelerations by diff
    }
}