当前位置: 首页 > 知识库问答 >
问题:

Java游戏帧率下降

莫乐
2023-03-14

我正在开发一个从图像加载关卡的平台游戏。它循环穿过图像的所有像素,并检查RGB值是否与某个对象匹配,例如黄色表示硬币,白色表示墙壁。

一旦玩家死亡,关卡将重新加载,但是当场景中还有一个炮塔时,游戏的帧速率会下降。

循环遍历所有像素的方法。

    // Loads the requested level based on a image

public void loadLevel(BufferedImage Image)
{
    clearLevel();

    int imageWidth = Image.getWidth();
    int imageHeight = Image.getHeight();

    currentLevel = Image;

    for(int Par1 = 0; Par1 < imageHeight; Par1++)
    {
        for(int Par2 = 0; Par2 < imageWidth; Par2++)
        {
            int currentPixel = Image.getRGB(Par1, Par2);

            int redValue = (currentPixel >> 16) & 0xff;
            int greenValue = (currentPixel >> 8) & 0xff;
            int blueValue = (currentPixel) & 0xff;

            if(redValue == 255 && greenValue == 255 && blueValue == 255)
            {
                addObject(new Block((Par1 * 32), (Par2 * 32), 0, 0, 0, Identifier.Block));
            }

            if(redValue == 255 && greenValue == 0 && blueValue == 0)
            {
                addObject(new Block((Par1 * 32), (Par2 * 32), 1, 0, 0, Identifier.Lava));
            }

            if(redValue == 255 && greenValue == 0 && blueValue == 255)
            {
                addObject(new Block((Par1 * 32), (Par2 * 32), 5, 0, 8, Identifier.Platform));
            }

            if(redValue == 0 && greenValue == 255 && blueValue == 255)
            {
                addObject(new Block((Par1 * 32), (Par2 * 32), 4, 1, 8, Identifier.Platform));
            }

            if(redValue == 255 && greenValue == 255 && blueValue == 0)
            {
                addObject(new Block((Par1 * 32), (Par2 * 32), 2, 0, 0, Identifier.Coin));
            }

            if(redValue == 0 && greenValue == 255 && blueValue == 0)
            {
                addObject(new Block((Par1 * 32), (Par2 * 32), 3, 0, 0, Identifier.Flag));
            }

            if(redValue == 0 && greenValue == 0 && blueValue == 255)
            {
                addObject(new Player((Par1 * 32), (Par2 * 32), this, Identifier.Player));
            }

            if(redValue == 255 && greenValue == 175 && blueValue == 0)
            {
                addObject(new Turret((Par1 * 32), (Par2 * 32), this, Identifier.Turret));
            }
        }
    }

    Main.currentState = Main.State.Game;
}


// Reload level

public void reloadLevel()
{
    loadLevel(currentLevel);
}

游戏循环

//在线程启动时运行,同时启动游戏循环并创建单独的滴答和每秒帧数行

public void run() 
{
    try 
    {
        preInitialisation();
        initialisation();

        LogHandler.log("Initialisation complete.");
    } 

    catch(FileNotFoundException Error) 
    {
        Error.printStackTrace();
    } 

    catch(FontFormatException Error) 
    {
        Error.printStackTrace();
    } 

    catch(IOException Error) 
    {
        Error.printStackTrace();
    }

    requestFocus();

    long lastTime = System.nanoTime();

    double amountOfTicks = 60.0;
    double nanoSeconds = 1000000000 / amountOfTicks;
    double deltaValue = 0;

    long currentTime;   
    long loopTimer = System.currentTimeMillis();

    while(isRunning)
    {
        currentTime = System.nanoTime();
        deltaValue += (currentTime - lastTime) / nanoSeconds;
        lastTime = currentTime;

        while(deltaValue >= 1)
        {
            tick();

            deltaValue--;
            temporaryTicks++;
        }

        render();
        temporaryFrames++;

        if(System.currentTimeMillis() - loopTimer > 1000)
        {
            loopTimer += 1000;

            absoluteFrames = temporaryFrames;
            absoluteTicks = temporaryTicks;

            temporaryTicks = 0;
            temporaryFrames = 0;
        }
    }
}

共有1个答案

辛渝
2023-03-14

结果是增加了LWJGL库,然后使能vsync。

Display.setVSyncEnabled(true);

我还将所有LinkedLists更改为ArrayLists,因为它的方式更快,何时使用LinkedList而不是ArrayList?

 类似资料:
  • 每个pyplay都有一个游戏循环,看起来像这样: 根据的api: 返回自调用pygame.init()以来的毫秒数。在pyplay被初始化之前,这将永远是0。 但是: 此方法应每帧调用一次。它会计算出有多少。自上次调用以来已过毫秒。 如果您传递可选的framerate参数,函数将延迟以使游戏运行速度低于给定的每秒滴答数。这可以用来帮助限制游戏的运行速度。通过呼叫时钟。每帧勾选(40)一次,程序的运

  • 下载游戏 可透过以下方法下载(购买)游戏。可下载(购买)的游戏分为两种,一种是只可在PSP™上游玩的游戏,另一种则可在PSP™和PS3™两种主机上游玩。关于游戏的种类和对应的主机等信息,可在PlayStation®Store上确认。 PSP™的(PlayStation®Store) 有关下载(购买)游戏的详细方法,请参阅(PlayStation®Network) > (PlayStation®St

  • 包含在程序启动时启动的线程。这个线程包含一个循环,每40毫秒更新一次游戏并重新绘制()board。 备选办法B: 板创建一个摆动计时器。这个计时器的动作监听器是板本身。actionPerformed()方法每40毫秒运行一次,并更新game+repaints Board()。 谢谢

  • 我已经开发了一个2D侧滚动平台一段时间了。这是我的第一场正式比赛,快结束了。到目前为止,我还没有过多考虑过决议。 我的游戏是基于瓷砖的,大多数瓷砖和玩家精灵都是。尺寸为40x40像素的PNG文件。默认屏幕高度和宽度为1280x720。据我所知,现在的大多数游戏都有很多不同的分辨率选择和不同的纵横比。 我想给玩家几个分辨率的选择,比如800x600、1024x768和1280x720。这需要这样做,

  • 游玩已下载的游戏 可游玩自(PlayStation®Store)下载(购买)的游戏。 开始游玩游戏 1. 选择 (游戏)的 (Memory Stick™) 或 (主机内存)。 2. 选择想启动之游戏的图示。 离开游戏 游玩游戏时按下PS按钮(HOME(归返)按钮)。请遵循画面指示,正确操作。 暂停游戏 保存游玩中的游戏进度,再暂时离开游戏。 游玩游戏时按下PS按钮。请遵循画面指示,正确操作。 要使

  • 所以我为我的课做了一个抽动练习作业。我已经成功地创建了一个简单的Tic Tac Toe程序,但不知何故,检查绘制的方法有时并不正确。如果所有东西都填满了,但没有赢家,那就是平局。但如果除第0行第1列外,其他所有内容都已填满,则即使该框仍为空白,它仍将显示“Draw”。如果你不明白我的意思,就试着把所有的东西都填满,但不是赢,即使最后一个框没有填满,它也会说“平局”。我在代码中做错了什么????驱动