Java-为什么我的platformer游戏的性能这么低?

Java-为什么我的platformer游戏的性能这么低?,java,performance,Java,Performance,我目前正在用java开发一个platformer游戏,我很难弄清楚为什么这会大大降低性能。只渲染相机视图中的纹理,我甚至尝试清除相机视图之外的所有对象,因此阵列几乎为空,我仍然无法获得良好的帧率。当我对这个方法的调用进行注释时,游戏以300 FPS的速度运行,但是当我运行它时,即使我删除了所有的后记,我仍然只能以40 FPS的速度运行。这不是渲染的问题,因为我已经对此进行了彻底的测试。如有任何反馈,将不胜感激。代码如下: public void buildTerrain(BufferedImag

我目前正在用java开发一个platformer游戏,我很难弄清楚为什么这会大大降低性能。只渲染相机视图中的纹理,我甚至尝试清除相机视图之外的所有对象,因此阵列几乎为空,我仍然无法获得良好的帧率。当我对这个方法的调用进行注释时,游戏以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);
            }
        }
    }
}
public void buildTerrain(buffereImage bi){
//此方法将获取图像并在此基础上构建标高。
int width=bi.getWidth();
int height=bi.getHeight();
对于(int x=0;x>16)&0xff;
int g=(像素>>8)&0xff;
int b=(像素)&0xff;
如果(r==255&&
g==255&&
b==255)
h、 添加对象(新块(x*32,y*32,
ID.blockStone,GameState.level1,tex);
如果(r==0&&
g==0&&
b==255){
p、 setX(x*32);
p、 setY(y*32);
p、 设置高度(64);
}
}
}
}
参考资料: h是一个处理程序对象,它包含一个方法addObject(GameObject) 块扩展游戏对象 p是玩家,巫婆也扩展了游戏对象

编辑:此代码不是在循环中调用的,它在每个关卡开始时运行一次以加载地形。AddObject()方法所做的就是将块添加到数组中,然后在tick()和render()方法中对其进行迭代。仅渲染摄影机范围内的对象,并且块的tick()方法为空。

是否可以尝试:

    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和+3等于+3等于)
    操作
  • 在我的代码中,您执行
    width*height*2*(and+test)
    操作

单独绘制/读取像素非常昂贵,请尽量避免。如果可能的话(因为这基本上只是加载一个映射?),请尝试只执行一次。要么@callyalater是正确的,要么调用该方法太频繁,要么我会怀疑addObject方法在“h”对象上运行缓慢。顺便问一下,“h”是什么?我不认为我们可以仅仅从一个循环中调试它。我想看一个诊断系统,这样我们就可以准确地诊断出问题所在。有太多可能的原因导致您可能会看到减速。这个问题可能属于使用探查器来找出瓶颈是什么的问题。