为什么我的比赛滞后?

时间:2013-04-29 15:45:06

标签: java multithreading timing lag

我正在制作基本的2D游戏,但我遇到了延迟问题。游戏中的角色移动得很好,但有时会减速,主要是靠近敌人。然而,敌人并没有造成滞后,因为我在屏幕上同时有50个并且运行正常。 我完成的时间几乎与它在Java中的Killer游戏编程书中完成的时间完全相同,但它似乎没有太好用。 FPS似乎也发生了很大变化,但它不应该,因为它应该总是花费15ms来完成更新渲染 - 绘画 - 睡眠周期,有人可以解释一下吗?

此外,我认为当我的计算机在后台进行操作(防病毒扫描等)时它会更加滞后,虽然我可以在运行其他程序时以大约550FPS运行游戏,所以我不认为这是我的计算机。

以下是我的时间安排:

        int waitTime = 1000 / 65; //65 being the desired FPS
        while(running){
        if(!loading){
            gameUpdate();
            gameRender();
            gamePaint();

            afterTime = System.nanoTime();
            timeDiff = afterTime - beforeTime;
            sleepTime = waitTime - (timeDiff / 1000000L);

            if(sleepTime > 0){
                try{
                    mainThread.sleep(sleepTime);
                } catch(InterruptedException ie){}
            }
            else{ 
                sleepSkipped++;
                if(sleepSkipped == maxSleepSkipped){
                    Thread.yield();
                    sleepSkipped = 0;
                }
            }

            fpsTime += (System.nanoTime() - beforeTime) / 1000000;
            fps++;
            if(fpsTime > 1000){
                System.out.println("FPS: " + fps);
                fps = 0;
                fpsTime = 0;
            }

            beforeTime = System.nanoTime();
        }
    }

2 个答案:

答案 0 :(得分:0)

我认为您的问题与最近的问题类似Weird behavior in Thread.sleep() 我在你的循环中看到你将休眠时间添加到你的计时器,意味着它不断增加(降低fps),直到它变得如此之大以至于减去等待时间给出一个负数,使你的循环进入产生线程的那个它会增加跳数并在计数足够高时产生。

答案 1 :(得分:0)

正如arynaq所说,这是敌人碰撞检测的一个问题。每个循环通过循环使每个敌人调用相当多的方法,但是我现在已经删除并重新定位了许多方法调用,这完全解决了滞后问题。谢谢你,arynaq。