首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java游戏循环卡顿

Java游戏循环卡顿
EN

Stack Overflow用户
提问于 2021-05-19 06:02:01
回答 1查看 107关注 0票数 1

作为练习,我试着做了一个简单的程序,你所要做的就是控制屏幕周围的方块。我试着用插值法做一个游戏循环,但是我对它有问题,它经常卡顿,我不知道为什么。我已尝试删除Thread.sleep(%1);以确定这是否是问题所在。如果我去掉它,它实际上会减少卡顿,fps会从300fps左右跳到8000fps左右。当然,如果我让这个游戏变得更复杂,我就不能得到8000fps,所以我想看看如果我只有大约300fps,是否仍然存在卡顿,所以我所做的就是在屏幕上添加了一堆方块。这使fps降到了300左右,我注意到卡顿又回来了。我已经看过Game loopFix your timestep了,但是我没有找到一个解决方案。我做错了什么?

游戏循环:

代码语言:javascript
复制
    int targetUps = 60;
    int timePerUpdate = 1_000_000_000 / targetUps;
    long oldTime = System.nanoTime();
    long newTime;
    int accumulator = 0;
    int upsTimer = 0;
    int upsCounter = 0;
    int fpsCounter = 0;

    while(true) {
        newTime = System.nanoTime();
        accumulator += newTime - oldTime;
        upsTimer += newTime - oldTime;
        oldTime = newTime;

        while(accumulator >= timePerUpdate) {
            update();
            accumulator -= timePerUpdate;
            upsCounter++;
        }

        render(Math.min(1.0f, (double) accumulator / timePerUpdate));
        fpsCounter++;

        if(upsTimer >= 1_000_000_000) {
            System.out.println("UPS: " + upsCounter + " | " + "FPS: " + fpsCounter);
            fpsCounter = 0;
            upsCounter = 0;
            upsTimer = 0;
        }
        try {
            Thread.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

render方法:

代码语言:javascript
复制
private void render(double delta) {
    BufferStrategy bs = window.getBufferStrategy();
    Graphics g = bs.getDrawGraphics();
    g.setColor(Color.DARK_GRAY);
    g.fillRect(0,0,Window.WIDTH, Window.HEIGHT);
    player.render(g, delta);
    bs.show();
    g.dispose();
}

Player`s的渲染方法:

代码语言:javascript
复制
 public void render(Graphics g, double delta) {
    g.setColor(Color.GREEN);
    double renderX = oldX + (x - oldX) * delta;
    double renderY = oldY + (y - oldY) * delta;
    g.fillRect((int) renderX, (int) renderY, 32, 32);
}
EN

回答 1

Stack Overflow用户

发布于 2021-05-23 04:13:45

你需要像这样使用增量:

代码语言:javascript
复制
state = currentState * delta + previousState * ( 1.0 - delta );

当累加器等于timePerUpdate (60 FPS)时,增量将为0。

由于您的代码从不使用(1.0 -增量),

代码语言:javascript
复制
 double renderX = oldX + (x - oldX) * delta;
 double renderY = oldY + (y - oldY) * delta;

意味着您忽略了更新,因此出现了卡顿。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67594462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档