【发布时间】: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