Java 为什么我的比赛落后了?

Java 为什么我的比赛落后了?,java,multithreading,timing,lag,Java,Multithreading,Timing,Lag,我正在做一个基本的2D游戏,但我有滞后的问题。游戏中的角色移动自如,但有时会减速,主要是在靠近敌人时。不过,敌人并没有造成延迟,因为我已经在屏幕上同时显示了50个,并且运行良好。 我所做的计时工作与《Java杀手游戏编程》一书中的计时工作几乎完全相同,但似乎效果不太好。FPS似乎也改变了很多,这是不应该的,因为它应该总是需要15毫秒来完成更新渲染绘制睡眠周期,有人能解释这一点吗 此外,我认为当我的电脑在后台运行(防病毒扫描等)时,它的运行速度会更慢,尽管我可以在运行其他程序时以大约550FPS的

我正在做一个基本的2D游戏,但我有滞后的问题。游戏中的角色移动自如,但有时会减速,主要是在靠近敌人时。不过,敌人并没有造成延迟,因为我已经在屏幕上同时显示了50个,并且运行良好。 我所做的计时工作与《Java杀手游戏编程》一书中的计时工作几乎完全相同,但似乎效果不太好。FPS似乎也改变了很多,这是不应该的,因为它应该总是需要15毫秒来完成更新渲染绘制睡眠周期,有人能解释这一点吗

此外,我认为当我的电脑在后台运行(防病毒扫描等)时,它的运行速度会更慢,尽管我可以在运行其他程序时以大约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();
        }
    }

我认为你的问题与最近的问题相似
我看到在你的循环中,你把睡眠时间加到你的计时器上,这意味着它一直在增加(降低fps),直到它变大,从中减去waittime就会得到一个负数,使你的循环进入一个产生线程的循环,在那里它加上skipcount,当计数足够高时产生。

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

靠近敌人时你会怎么做?碰撞/战斗可能会有一个bug,我看你的循环没有问题。每个敌人都会一直检查玩家。只有在敌人靠近的时候,我才会让他们检查玩家,但我不能。不过我会好好看看碰撞检测。我不知道你的意思。在我的循环中,根据更新、渲染和绘制方法所用的时间,我让线程睡眠一段设定的时间。我没有添加任何内容。请尝试通过该工具运行并查看FPS,尽管我很高兴我的第一个建议有所帮助,但我可能错了:)