Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.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 这个游戏循环中的FPS下降是多少?_Java_Class_Rendering - Fatal编程技术网

Java 这个游戏循环中的FPS下降是多少?

Java 这个游戏循环中的FPS下降是多少?,java,class,rendering,Java,Class,Rendering,有人能告诉我为什么FPS每几次迭代就从100(期望值)下降到91吗?在我的原始应用程序中,我尽可能简洁地使用了双缓冲和主动渲染,在这个示例中,同样的情况也会发生,但我使用被动渲染。FPS不断从100下降到91,我不知道为什么 代码 另外,请不要编辑标题并将FPS拼错为FDS。您是否尝试分析代码以查看其速度减慢的地方?此外,不要使用getGraphics执行自定义绘制,这将在下次重绘管理器决定绘制组件时被清除,因为您是从线程执行的,可能会产生脏油漆^是的,我理解。我只是为了更快地证明我的问题。我在

有人能告诉我为什么FPS每几次迭代就从100(期望值)下降到91吗?在我的原始应用程序中,我尽可能简洁地使用了双缓冲和主动渲染,在这个示例中,同样的情况也会发生,但我使用被动渲染。FPS不断从100下降到91,我不知道为什么

代码


另外,请不要编辑标题并将FPS拼错为FDS。您是否尝试分析代码以查看其速度减慢的地方?此外,不要使用
getGraphics
执行自定义绘制,这将在下次重绘管理器决定绘制组件时被清除,因为您是从线程执行的,可能会产生脏油漆^是的,我理解。我只是为了更快地证明我的问题。我在具有活动渲染的图像上使用getGraphics。我还没有尝试过评测,但我会试一试。如果
睡眠时间
过多,你永远不会重置
睡眠时间
import javax.swing.JPanel;
import javax.swing.JFrame;


import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;

public class Test extends JPanel implements Runnable {

    Image img;

    int fps;
    @Override 
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        if(img != null) {
            g.drawImage(img, 0, 0, null);
        }

    }

    public void gameUpdate() {

}

public void gameRender() {
Graphics g  = getGraphics();
g.setColor(Color.BLACK);
for(int i = 0; i < 1000; i++)
    g.fillRect(0, 0, 50, 50);

}


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

    private Thread thread;
    @Override
    public void run() {
    long beforeTime = 0;
    long afterTime = 0;
    long timeDiff = 0;
    int period = 10000000;
    long sleepTime = 0; 
    long overSleepTime = 0;
        while(true) {
            beforeTime = System.nanoTime();
            gameUpdate();
            gameRender();
            repaint();
            afterTime = System.nanoTime();
            timeDiff = afterTime - beforeTime;
            sleepTime = (period - timeDiff) - overSleepTime;

            if(sleepTime > 0) {
            try {
                Thread.sleep(sleepTime/1000000L);
            }  catch (InterruptedException e){}
            long threadSleepTime = System.nanoTime() - afterTime;
            overSleepTime  = threadSleepTime - sleepTime;

            fps = (int)FPSCounter.getFPS(threadSleepTime, timeDiff);
            System.out.println(fps);
        } // end if

        } 

    }

    public void addNotify() {
        super.addNotify();
        startGame();
    }



    public static void main(String[] args) {
        JFrame f = new JFrame("Title");
        f.setSize(500, 500);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setContentPane(new Test());
        f.setVisible(true);

    }


}
/**
 * Return the current FPS
 * @param threadSleep Amount of time thread has slept
 * @param renderTime Amount of time took rendering/updating
 * @return
 */
public static double getFPS(long threadSleep, long renderTime) {
    return 1000000000 / (threadSleep + renderTime);
}