Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.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_Frame Rate - Fatal编程技术网

Java 如何使帧速率保持一致?

Java 如何使帧速率保持一致?,java,frame-rate,Java,Frame Rate,我正在制作简单的2D游戏。我有一个游戏循环,在游戏循环中我有一个更新 方法。每当xPos循环时,我都会向它添加1,从而使事情发生变化。这意味着,如果你有一个缓慢的fps,那么一切都在慢动作,如果你有一个高fps,一切都在移动 真快 这是我的代码: long fpsTimer; int frames; public void run(){ running = true; fpsTimer = System.nanoTime();

我正在制作简单的2D游戏。我有一个游戏循环,在游戏循环中我有一个更新 方法。每当xPos循环时,我都会向它添加1,从而使事情发生变化。这意味着,如果你有一个缓慢的fps,那么一切都在慢动作,如果你有一个高fps,一切都在移动 真快

这是我的代码:

    long fpsTimer;
    int frames;
    public void run(){
        running = true;
        fpsTimer = System.nanoTime();

        while(running){
            render();
            update();

            try{
                Thread.sleep(6);
            }catch(InterruptedException e){}
            frames++;

            if(System.nanoTime() >= fpsTimer+1000000000){
                System.out.println(frames+" fps");
                frames = 0;
                fpsTimer = System.nanoTime();
            }
        }
    }
所有代码

    import java.awt.*;
    import java.awt.image.*;
    import javax.swing.JFrame;
    import java.awt.event.*;

    public class Game extends Canvas implements Runnable{
        public static final int WIDTH = 800;
        public static final int HEIGHT = 300;
        public JFrame f;
        private String title = "Untitled Test";
        private Image image;
        private Sprite player;

        public Game(){
            player = new Sprite(100, 100);
            setPreferredSize(new Dimension(WIDTH, HEIGHT));
            setMaximumSize(new Dimension(WIDTH, HEIGHT));
            setMinimumSize(new Dimension(WIDTH, HEIGHT));

            addKeyListener(new KeyAdapter(){
                public void keyPressed(KeyEvent e){
                    player.keyPressed(e.getKeyCode());
                }

                public void keyReleased(KeyEvent e){
                    player.keyReleased(e.getKeyCode());
                }
            });
        }

        public static void main(String[] args){
            Game g = new Game();
            g.f = new JFrame(g.title);
            g.f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            g.f.add(g);
            g.f.setResizable(false);
            g.f.pack();
            g.f.setLocationRelativeTo(null);
            Thread gameLoop = new Thread(g);
            gameLoop.start();
            g.f.setVisible(true);
        }

        private void render(){
            BufferStrategy bs = getBufferStrategy();
            if(bs==null){
                createBufferStrategy(3);
                return;
            }

            image = createImage(WIDTH, HEIGHT);
            Graphics g = image.getGraphics();

            player.draw(g);

            g.dispose();
            Graphics bsg = bs.getDrawGraphics();
            bsg.drawImage(image, 0, 0, WIDTH, HEIGHT, null);
            bsg.dispose();
            bs.show();
        }

        private void update(){
            player.move();
        }

        long fpsTime;
        int frames;

        public void run(){
            fpsTime = System.nanoTime();

            while(true){

                render();
                update();

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

                frames++;
                if(System.nanoTime() >= fpsTime+1000000000){
                    System.out.println(frames+" fps");
                    frames = 0;
                    fpsTime = System.nanoTime();
                }
            }
        }
    }

首先你不应该有固定的睡眠时间。相反,应该动态计算该值。也许更容易使用
Timer#scheduleAtFixedRate(…)
因为这已经为您解决了这个问题

然后,每次迭代6毫秒似乎太少了。每秒60帧是理想的(如果你只有30帧,我想也可以),所以16毫秒就足够了(或者30帧每秒32帧左右)。(请注意,屏幕的刷新率是上限-应该是60 Hz左右-更多没有意义)

第三考虑动态计算对象的移动。与其在坐标中添加一个常量增量,不如使用某种“移动函数”,根据当前时间计算坐标

假设您希望以每秒pps像素的恒定速度沿x轴移动对象。该对象的x坐标的函数为:

x(t) := x0 + (t - t0) * pps / 1000
t
是自开始以来经过的时间,单位为ms,
x0
是对象首次出现时的初始x坐标,
t0
是对象出现的时间,
pps
是对象每秒应移动的像素数)

这使得你的物体以同样的速度移动——不管你的帧速率是多少


请注意,如果您的对象应该对用户输入或其他事件(如碰撞等)做出反应,这种方法会变得更复杂。

那么这里的问题是什么?@GV,我认为问题是“如何使帧速率一致?”Swing,AWT什么用于GUI?使用BufferStrategy和CanvasCan可以上载一些功能代码?大概