Java - 为什么我的平台游戏的性能如此之低?

时间:2016-03-07 16:12:31

标签: java performance

我目前正在研究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对象,包含一个方法addObject(GameObject) Block扩展了GameObject p是一个玩家,女巫也扩展了GameObject。

编辑:此代码不在循环中调用,它在每个级别的开头运行一次以加载地形。所有AddObject()方法都将块添加到数组中,然后在tick()和render()方法中迭代。仅渲染摄像机范围内的对象,并且块的tick()方法为空。

1 个答案:

答案 0 :(得分:0)

你可以尝试一下:

    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)的必要性,而你可以使用二进制&(0xffffff00,它可能是0x00ffffff)。

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