限制我的游戏的FPS

时间:2011-06-02 17:00:05

标签: java frame-rate

好吧,我正在做一个小游戏,我需要限制我的FPS,因为,当我在我真正快速的计算机上玩时,我有大约850 FPS,游戏将会变得非常快,而且当我切换到我的旧电脑,它变得更慢,所以我需要限制我的FPS才能做到这一点。我如何限制我的FPS? 我的主要游戏循环:

    public void startGame(){
    initialize();
    while(true){
        drawScreen();
        drawBuffer();
        plyMove();

        //FPS counter
        now=System.currentTimeMillis(); 
        framesCount++; 
        if(now-framesTimer>1000){
            framesTimer=now; 
            framesCountAvg=framesCount; 
            framesCount=0; 
        }

        try{
            Thread.sleep(14);
        }catch(Exception ex){}
    }
}

我如何绘制屏幕,​​并绘制所有其他东西,球员,球等。 这场比赛是重拍,顺便说一句。

    public void drawBuffer(){
    Graphics2D g = buffer.createGraphics();
    g.setColor(Color.BLACK);
    g.fillRect(0,0,600,500);
    g.setColor(Color.GREEN);
    g.fillRect(ply1.getX(),ply1.getY(),ply1.getWidth(),ply1.getHeight());
    g.setColor(Color.RED);
    g.fillRect(ply2.getX(),ply2.getY(),ply2.getWidth(),ply2.getHeight());
    g.setColor(Color.WHITE);
    g.fillOval(ball1.getX(),ball1.getY(),ball1.getWidth(),ball1.getHeight());
    g.drawString("" + framesCountAvg,10,10);
}

public void drawScreen(){
    Graphics2D g = (Graphics2D)this.getGraphics();
    g.drawImage(buffer,0,0,this);
    Toolkit.getDefaultToolkit().sync();
    g.dispose();
}

6 个答案:

答案 0 :(得分:4)

听起来你的显示器与游戏引擎相关联。确保两者断开连接。无论帧速率如何,您都希望游戏以相同的速度播放。如果您的快速计算机重新快速重新绘制屏幕,​​那么如果引擎导致游戏以恒定速度播放就可以。

答案 1 :(得分:2)

不要限制你的FPS,而是在fps很高的时候让游戏变得非常快。

据推测,您有代码可以在每个帧中执行某些操作,例如如果按下按钮,则向前移动角色。你要做的是将字符向前移动一定量,这取决于自上一帧以来经过的时间量。

答案 2 :(得分:1)

如上所述,你需要将你的显示循环与你游戏核心某处的更新循环分开,这可能是这样的

while (1)
{
    drawscene();
    update();
}

在更新中,您将时间提前一个固定的数量,例如0.17秒。如果您正好以60fps绘制,那么动画将实时运行,在850fps时,所有内容都将加速因子14(0.17 * 850)以防止这种情况,您应该使您的更新时间相关。例如

elapsed = 0;
while (1)
{
   start = time();
   update(elapsed); 
   drawscene();
   sleep(sleeptime);
   end = time();

   elapsed = end - start;
}

答案 3 :(得分:0)

我在评论中的含义说明。你的方法plyMove();里面我怀疑有类似

的东西
plyMove() {
    ply1.x += amountX;
    ply1.y += amountY;
}

而是根据经过的时间进行移动

plyMove(double timeElapsed) {
    ply1.x += amountX * timeElapsed;
    ply1.y += amountY * timeElapsed;
}

您可以根据主循环中的时差计算timeElapsed,并相应地进行缩放以获得不错的移动。

double timePrev = System.currentTimeMillis();
while(true) {
    double timeNow = System.currentTimeMillis();
    double elapsed = timeNow - timePrev;

    drawScreen();
    drawBuffer();
    plyMove(0.001 * elapsed);

    timePrev = timeNow;
}

答案 4 :(得分:0)

如果你真的想要一个固定的时间帧游戏,你可以这样做:

float timer = 0;
float prevTime= System.currentTimeMillis();
while(true)
{
    draw();

    float currentTime = System.currentTimeMillis();
    timer += currentTime - prevTime;

    while (timer > UPDATE_TIME) // To make sure that it still works properly when drawing takes too long
    {
        timer -= UPDATE_TIME;
        update();
    }
}

其中UPDATE_TIME处于您想要以毫秒为单位更新的时间间隔。

答案 5 :(得分:-3)

一种方法是使用

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

在主循环结束时。根据您的需要调整数量。