Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java突破游戏滞后_Java - Fatal编程技术网

Java突破游戏滞后

Java突破游戏滞后,java,Java,我写了一个突破游戏,实际上我已经完成了。这是我的第一个“大”java项目。游戏在我的电脑上运行平稳,没有延迟,也没有问题。但是如果我在我的笔记本电脑上运行它(相同的代码),那么它运行得更慢,并且滞后。我确信我的笔记本电脑的硬件足以运行这个。我应该使用其他游戏循环,还是我的笔记本电脑有问题?他们都有Windows10 我在另一台笔记本电脑(Win 7)上做了一个测试,他们的it运行没有延迟,在第三台笔记本电脑(Win 10)上做了一个测试,但他们的问题相同 好的,我发现了一些东西。当我启动英特尔图

我写了一个突破游戏,实际上我已经完成了。这是我的第一个“大”java项目。游戏在我的电脑上运行平稳,没有延迟,也没有问题。但是如果我在我的笔记本电脑上运行它(相同的代码),那么它运行得更慢,并且滞后。我确信我的笔记本电脑的硬件足以运行这个。我应该使用其他游戏循环,还是我的笔记本电脑有问题?他们都有Windows10

我在另一台笔记本电脑(Win 7)上做了一个测试,他们的it运行没有延迟,在第三台笔记本电脑(Win 10)上做了一个测试,但他们的问题相同

好的,我发现了一些东西。当我启动英特尔图形控制面板,然后游戏运行完美。当我在不启动“英特尔图形控制面板”的情况下运行它时,它会滞后

希望你能帮助我

这是我的游戏课

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.Timer;


public class Gameplay extends JPanel implements ActionListener, KeyListener{



 private Timer timer;
 private int  delay = 5;


 //Timer tm= new Timer(5, this);

 boolean play = false;
 int score = 0;

 int totalBricks = 28;



 // Paddle
 int xbat = 355 , velX = 0;

 //Image img;


 //Ball

 int xball = 395,  yball = 450;
 int ballXdir = 5;
 int ballYdir = -3;


 Font f1 = new Font("serif", Font.BOLD, 20);


 public BrickMap map;

 public Gameplay()
 {

    map = new BrickMap(4,7);
    //tm.start();
    addKeyListener(this);
    setFocusable(true);
    setFocusTraversalKeysEnabled(false);
    timer = new Timer(delay,this);
    timer.start();

 }







  public void paint(Graphics g)
  {

    g.setColor(Color.gray);
    g.fillRect(0,0,800,700);

        // Paddle
    g.setColor(Color.blue);
    g.fillRect(xbat, 600, 110, 17);

    // Ball
    g.setColor(Color.green);
    g.fillOval(xball, yball, 22,22);


    //Won
    if(totalBricks <= 0){
        play = false;
        ballXdir = 0;
        ballYdir = 0;
        g.setColor(Color.YELLOW);
        g.setFont(f1);
        g.drawString("You Won " + score,320 ,350);

        g.setFont(f1);
        g.drawString("Mit Enter neustarten",350 ,660);

    }
    // Game Over
    if(yball > 605){
        play = false;
        ballXdir = 0;
        ballYdir = 0;
        g.setColor(Color.YELLOW);
        g.setFont(f1);
        g.drawString("Game Over, Score: " + score,320 ,400);

        g.setFont(f1);
        g.drawString("Mit Enter neustarten",350 ,660);
    }


    // score
    g.setColor(Color.YELLOW);
    g.setFont(f1);
    g.drawString(""+score,5 ,660);

    // Bricks
    map.draw((Graphics2D)g);



       g.dispose();


 }



 @Override
 public void actionPerformed(ActionEvent e)
 {
    timer.start();


 // Paddle----------------------------
    if (xbat < 0) {
        velX =0;
        xbat = 0;
    }

    if (xbat > 690) {
        velX = 0;
        xbat = 690;
    }

    xbat = xbat + velX;
 //----------------------------------

 // Ball-----------------------------

    //Paddle und ball detection
    if(play) {
        if(new Rectangle(xball, yball, 22, 22).intersects(new Rectangle(xbat, 600, 110, 17))) {

           ballXdir = (int) (Math.random()*5);

           if(ballXdir <3){

           }
           else{
               ballXdir = -ballXdir;
           }

           ballYdir = -ballYdir;


        }


        //ball und bricks
       A: for(int i = 0; i < map.map.length; i++){
            for(int j = 0; j < map.map[0].length; j++){
                if(map.map[i][j] > 0){
                    int brickX = j * map.brickWigth + 80;
                    int brickY = i * map.brickHeight + 50;
                    int brickWidth = map.brickWigth;
                    int brickHeight = map.brickHeight;


                    Rectangle rect = new Rectangle(brickX, brickY, brickWidth, brickHeight);
                    Rectangle ballRect = new Rectangle(xball, yball, 22, 22);
                    Rectangle brickRect = rect;


                    // Der Ball trifft auf die Bricks. Ein Brick wird      abgezogen und 10 Punkte zur Score hinzugefügt
                    if(ballRect.intersects(brickRect)){
                        map.setBrickValue(0 , i , j);
                        totalBricks --;
                        score += 10;


                        if(xball + 22 <= brickRect.x || xball + 1 >=   brickRect.x + brickRect.width){
                            ballXdir = -ballXdir;

                        } else {
                            ballYdir = -ballYdir;
                        }

                        break A;
                    }

                }
            }
        }


        xball += ballXdir;
        yball += ballYdir;
        if(xball < 0){
            ballXdir = -ballXdir;
        }
        if(yball < 0){
            ballYdir = -ballYdir;
        }
        if(xball > 778){
            ballXdir = -ballXdir;
        }



    }

 //----------------------------------


    repaint();


 }




 @Override
    public void keyPressed(KeyEvent e)
    {
   //Paddle------------------------------------------
        int c = e.getKeyCode();

        if (c == KeyEvent.VK_RIGHT){
            play = true;

            velX = +6;
        }

        if (c == KeyEvent.VK_LEFT){
            play = true;

            velX = -6;
        }
   //-----------------------------------------------

        //Wenn Enter gedrückt wird
        if(c == KeyEvent.VK_ENTER){
            if(!play){
                play = true;
                xball = 395;
                yball = 450;
                ballXdir = 5;
                ballYdir = -3;
                xbat = 355;
                score = 0;
                totalBricks = 28;
                map = new BrickMap(4, 7);


            }

        }

    }

    @Override
    public void keyReleased(KeyEvent e)
    {
  //Paddle--------------------------------------
    velX= 0;
  //--------------------------------------------
    }

    @Override
    public void keyTyped(KeyEvent e)
    {
    }




 }
import javax.swing.*;
导入java.awt.*;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.event.KeyEvent;
导入java.awt.event.KeyListener;
导入javax.swing.Timer;
公共类游戏扩展JPanel实现ActionListener、KeyListener{
私人定时器;
专用int延迟=5;
//定时器tm=新定时器(5,此);
布尔播放=假;
智力得分=0;
int=28;
//划桨
int xbat=355,velX=0;
//图像img;
//球
int xball=395,yball=450;
int-ballXdir=5;
int-ballYdir=-3;
字体f1=新字体(“衬线”,Font.BOLD,20);
公共砌砖地图;
公共游戏
{
map=新砌砖地图(4,7);
//tm.start();
addKeyListener(此);
设置聚焦(真);
setFocusTraversalKeysEnabled(false);
定时器=新定时器(延迟,此);
timer.start();
}
公共空间涂料(图g)
{
g、 setColor(颜色为灰色);
g、 fillRect(0,0800700);
//划桨
g、 setColor(Color.blue);
g、 fillRect(xbat,600,110,17);
//球
g、 setColor(Color.green);
g、 圆形(xball,yball,22,22);
//赢得
如果(605){
玩=假;
ballXdir=0;
ballYdir=0;
g、 setColor(颜色为黄色);
g、 setFont(f1);
g、 抽绳(“游戏结束,分数:+分数,320400”);
g、 setFont(f1);
g、 抽绳(“Mit Enter neustarten”,350660);
}
//得分
g、 setColor(颜色为黄色);
g、 setFont(f1);
g、 抽绳(“+分数,5660);
//砖块
绘制地图((图2d)g);
g、 处置();
}
@凌驾
已执行的公共无效操作(操作事件e)
{
timer.start();
//划桨----------------------------
if(xbat<0){
velX=0;
xbat=0;
}
如果(xbat>690){
velX=0;
xbat=690;
}
xbat=xbat+velX;
//----------------------------------
//球-----------------------------
//桨和球检测
如果(玩){
if(新矩形(xball,yball,22,22)。相交(新矩形(xbat,600,110,17))){
ballXdir=(int)(Math.random()*5);
if(ballXdir 0){
int brickX=j*map.brickWigth+80;
int brickY=i*map.brickHeight+50;
int brickWidth=map.brickWidth;
int brickHeight=map.brickHeight;
矩形矩形=新矩形(砖X、砖、砖宽、砖高);
矩形ballRect=新矩形(xball,yball,22,22);
矩形brickRect=rect;
//这是一个用砖砌成的球,砖上有一块砖,砖上有10个球
if(球直相交(砖斜相交)){
映射值(0,i,j);
总砖块--;
分数+=10分;
如果(xball+22=brickRect.x+brickRect.width){
ballXdir=-ballXdir;
}否则{
ballYdir=-ballYdir;
}
打破僵局;
}
}
}
}
xball+=ballXdir;
yball+=ballYdir;
如果(xball<0){
ballXdir=-ballXdir;
}
if(yball<0){
ballYdir=-ballYdir;
}
如果(xball>778){
ballXdir=-ballXdir;
}
}
//----------------------------------
重新油漆();
}
@凌驾
按下公共无效键(按键事件e)
{
//划桨------------------------------------------
int c=e.getKeyCode();
if(c==KeyEvent.VK_RIGHT){
玩=真;
velX=+6;
}
if(c==KeyEvent.VK_左){
玩=真;
velX=-6;
}
//-----------------------------------------------
//我们进入格德鲁克特世界
if(c==KeyEvent.VK_输入){
如果(!玩){
玩=真;
xball=395;
yball=450;
ballXdir=5;
ballYdir=-3;
xbat=355;
得分=0;
totalBricks=28;
地图=新的砖块地图(4,7);
}
}
}
@凌驾
公共无效密钥已释放(密钥事件e)
{
//划桨--------------------------------------
velX=0;
//--------------------------------------------
}
@凌驾
public void keyTyped(KeyEvent e)
{
}
}

一些胡乱猜测:这是因为垃圾收集器承受了压力

您创建了许多只存在很短时间的对象,例如在
paint()
g.setFont(新字体(“衬线”,Font.BOLD,25))。您可以为每个
paint
事件创建一个新的
Font
实例

如果不查找它,我会猜测
Font
是一个非常“大”的对象,因此给内存管理带来了很大的压力

尝试将字体放入全局变量:

public class gameplay extends JPanel implements ActionListener, KeyListener{
// ...
public final SCORE_FONT = new Font("serif", Font.BOLD, 25);
// ...

  public void paint(Graphics g)
  {
   // ...
   g.setFont(SCORE_FONT);
   // ...
  }
}
顺便说一句:Java约定用CamelCase编写类名,例如,
公共类游戏

这个问题