【问题标题】:Java - why is the performance of my platformer game so low?Java - 为什么我的平台游戏的性能如此之低?
【发布时间】:2016-03-07 16:12:30
【问题描述】:

我目前正在使用 java 开发平台游戏,但我无法弄清楚为什么这会大大降低性能。只渲染相机视野内的纹理,我什至尝试清除相机视野外的所有物体,以至于阵列几乎是空的,我仍然无法获得良好的帧率。当我注释掉对该方法的调用时,游戏以 300 FPS 的速度运行,但当我运行它时,即使我删除了后面的所有内容,我仍然只能得到 40 FPS。这不是渲染的问题,因为我已经对此进行了彻底的测试。任何反馈将不胜感激。代码如下:

public void buildTerrain(BufferedImage bi) {
    // this method will take an image and build a level based on it.
    int width = bi.getWidth();
    int height = bi.getHeight();
    for(int x = 0; x < width; x++){
        for(int y = 0; y < height; y++){
            int pixel = bi.getRGB(x, y);
            int r = (pixel >> 16) & 0xff;
            int g = (pixel >> 8) & 0xff;
            int b = (pixel) & 0xff;
            if(r == 255 &&
                g == 255 &&
                b == 255)
                h.addObject(new Block(x*32, y*32,
                ID.blockStone,GameState.level1, tex));
            if(r == 0 &&
                g == 0 &&
                b == 255){
                p.setX(x*32);
                p.setY(y*32);
                p.setHeight(64);
            }
        }
    }
}

参考: h 是一个 Handler 对象,witch 包含一个方法 addObject(GameObject) 块扩展游戏对象 p 是一个 Player,witch 也扩展了 GameObject。

编辑:此代码不是在循环中调用的,它在每个级别开始时运行一次以加载地形。 AddObject() 方法所做的只是将块添加到一个数组中,然后在 tick() 和 render() 方法中对其进行迭代。只渲染相机范围内的物体,blocks的tick()方法为空。

【问题讨论】:

  • 单独绘制/读取像素非常昂贵,请尽量避免这种情况。如果可能(因为这基本上只是加载地图?)尝试只执行一次。
  • @callyalater 是正确的,该方法只是被过于频繁地调用,或者我会暂停 addObject 方法在“h”对象上运行缓慢。顺便问一下,“h”是什么?
  • 我认为我们不能仅仅通过显示一个循环来调试它。我想看看MCVE,这样我们就可以准确诊断出问题所在。速度变慢的原因有很多。
  • 这个问题可能属于codereview.stackexchange.com
  • 使用分析器找出瓶颈是什么。

标签: java performance


【解决方案1】:

你可以试试:

    if(0xffffff00 == (pixel & 0xffffff00))
        h.addObject(new Block(x*32, y*32,
        ID.blockStone,GameState.level1, tex));
    if(0x0000ff00 == (pixel & 0x0000ff00)){
        p.setX(x*32);
        p.setY(y*32);
        p.setHeight(64);
    }

因为我不明白分解每个像素的 (r, g, b) 的需要,而您可以使用二进制 &amp;(0xffffff00,它可能是 0x00ffffff)来做到这一点。

  • 在您的代码中,您执行width*height*(3 shift + 3 and + 3 equals + 3 equals) 操作。
  • 在我的代码中,您执行width*height*2*(and + test) 操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-26
    相关资源
    最近更新 更多