Java LibGDX运动不平稳
我正在用LibGDX做一个游戏。我有4个纹理作为视差背景和一些障碍物(一个在屏幕的上部,另一个在底部),这是运动部分:Java LibGDX运动不平稳,java,android,libgdx,game-physics,parallax,Java,Android,Libgdx,Game Physics,Parallax,我正在用LibGDX做一个游戏。我有4个纹理作为视差背景和一些障碍物(一个在屏幕的上部,另一个在底部),这是运动部分: //Parallax if (bckgndmiddle_x <= -Const.VIEWPORT_W*2+(game_speed*delta)/2) bckgndmiddle_x=-(game_speed*delta)/2; else bckgndmiddle_x-=(game_speed*delta)/2; if (bckgndfar_x <= -
//Parallax
if (bckgndmiddle_x <= -Const.VIEWPORT_W*2+(game_speed*delta)/2) bckgndmiddle_x=-(game_speed*delta)/2; else bckgndmiddle_x-=(game_speed*delta)/2;
if (bckgndfar_x <= -Const.VIEWPORT_W*2+(game_speed*delta)/5) bckgndfar_x=-(game_speed*delta)/5; else bckgndfar_x-=(game_speed*delta)/5;
for (Obstacle obst:obstacles) {
obst.update(game_speed*delta);
}
//End Main game loop
player.update();
game.batch.begin();
game.batch.draw(wall, bckgndfar_x,floor.getRegionHeight()+100);
game.batch.draw(wall, bckgndfar_x+wall.getRegionWidth(),floor.getRegionHeight()+100);
game.batch.draw(bot_furniture, bckgndmiddle_x,floor.getRegionHeight());
game.batch.draw(bot_furniture, bckgndmiddle_x+bot_furniture.getRegionWidth(),floor.getRegionHeight());
game.batch.draw(floor, bckgndmiddle_x,0);
game.batch.draw(floor, bckgndmiddle_x+floor.getRegionWidth(),0);
game.batch.draw(ceiling, bckgndfar_x,Const.VIEWPORT_H-ceiling.getRegionHeight());
game.batch.draw(ceiling, bckgndfar_x+ceiling.getRegionWidth(),Const.VIEWPORT_H-ceiling.getRegionHeight());
//视差
如果(bckgndmiddle_x我发现一个可能的原因与FPS下降无关:
这是您的第一行,为便于阅读而分开:
if (bckgndmiddle_x <= -Const.VIEWPORT_W*2+(game_speed*delta)/2)
bckgndmiddle_x = -(game_speed*delta)/2;
else
bckgndmiddle_x -= (game_speed*delta)/2;
上面的2*
是因为我从您的其他代码中假设您实际上并排绘制了两个背景纹理副本。如果您绘制的是一个比视口宽度常量更宽的单个、更宽的纹理,那么您应该删除2*
同样的问题当然也适用于您的第二行代码,您正在设置远背景置换。听起来像垃圾收集问题。您在渲染循环中分配了很多对象吗?我不认为这是垃圾收集,我不使用那么多对象。我认为这与第二行代码有关绘制每个背景的宽度,它没有任何应用的三角洲,但我尝试了一些东西,它仍然不工作,这是什么样的帧速率运行?似乎有点不太可能下降1帧将产生可见的stuttering@rbennett485它以60fps的速度运行。在日志中,最小值约为59.2到59.9 fps2*是因为纹理是相机宽度的两倍。我仍在绘制两个副本,因此当第一个副本刚从屏幕上消失时,它会移动其长度以匹配另一个副本的末端。我会尝试一下,因为这对我来说是有意义的,我会尽快回复,但仍然是相同的行为。我注意到它是随机发生的,当必须校正位置时,不需要。
float midWidth = floor.getRegionWidth();
bckgndmiddle_x -= game_speed*delta/2; //Always move it at constant speed.
if (bckgndmiddle_x + 2*midWidth < Const.VIEWPORT_W) //Right edge starting to show.
bckgndmiddle_x += midWidth; // Shift it exactly by its width so the jump is undetectable