java游戏计时器使用了大量资源

时间:2016-10-12 13:55:37

标签: java timer cpu

所以我在java中制作游戏,我有一个问题。计时器使用了大量的cpu资源(大约30%),它可能不应该。当我尝试将渲染放入计时器时,一切正常。有时候,没有改变任何东西它可以正常工作

public static synchronized void run(){
    long last = System.nanoTime();
    double npt = Time.nano / tps; //one second / ticks
    double delta = 0;
    //long now;

    long pfmLast = System.currentTimeMillis();
    long pfmSpm = Time.nano * spu;
    long pfmDelta = 0;
    int pfmUpdates = 0;
    long pfmNow;

    long fpsLast = System.nanoTime();
    double npf = Time.nano / fps; //one second / ticks
    double fpsDelta = 0;
    //long fpsNow;

    int frames = 0;

    Handler.init();


    try {
        en = new Entity(ImageIO.read(new File("res/robot.png")), 1, 1, false);
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

    while(running){
        long now = System.nanoTime();
        delta += (now - last)/npt;
        last = now;

        while(delta >= 1){
            pfmUpdates++;
            Handler.update();

            delta -= 1;
        }

        long fpsNow = System.nanoTime();
        fpsDelta += (fpsNow - fpsLast)/npf;
        fpsLast = fpsNow;



        while(fpsDelta >= 1){
            frames++;
            render();
            Handler.render();

            fpsDelta -= 1;
        }



        if(loggingPerformance){
            pfmNow = System.currentTimeMillis();
            pfmDelta += pfmNow-pfmLast;
            pfmLast = pfmNow;

            if(pfmDelta >= 1000){
                System.out.println(pfmUpdates + ", " + frames);
                frames = 0;
                pfmUpdates = 0;
                pfmDelta=0;
            }

        }




        try {
            Thread.sleep(2);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        /*fpsNow = System.currentTimeMillis();
        fpsDelta += fpsNow - fpsLast;
        fpsLast = fpsNow;

        if(fpsDelta >= npf){
            //Handler.render();

            frames++;
            fpsDelta -= npf;
        }*/


    }
}

1 个答案:

答案 0 :(得分:0)

我认为问题在于你有几个while循环,这些循环基本上是在delta中计算每个纳秒的游戏状态。

这会给您的计算机带来巨大压力。

你要做的是做Handler.render() delta函数所做的任何计算,这样你只需计算一次,而不是每{2}次计算一次! / p>

所以我在想这个

1.000.000.000

应该是这样的:

    while(delta >= 1){
        pfmUpdates++;
        Handler.update();

        delta -= 1;
    }