我正在做一个游戏,我在一些(奇怪的)低端Android设备(Galaxy S mini,Galaxy ACE)上遇到了问题,实际上硬件不好。 FPS适用于85+以及其他设备(HTC Desire,Sony Xperia Arc S,三星Galaxy S,HTC Wildfire),FPS是正常的" (大约60FPS)。计算机上也显示了60 FPS。显然85+ FPS太多,因为游戏体验不同,可能会给那些玩85FPS +的玩家带来不公平的优势。
我想将FPS限制为MAX 60。
我已经搜索了这个论坛,我发现了我现在正在问的确切问题。 Limit FPS in Libgdx game with Thread.sleep() doesn't work
用户@daniel的(已接受)解决方案是:
Thread.sleep((long)(1000/30-Gdx.graphics.getDeltaTime()));
但问题是对我不起作用。如果我使用该代码(30代替60),我得到30-33 FPS或者如果我只使用Daniel的代码,我得到大约15-17 FPS。为什么这样,为什么不为我工作?如何将所有设备的FPS限制为MAX 60?我在计算机和设备上测试了这段代码。
任何帮助高度评价。谢谢。
答案 0 :(得分:7)
在您的启动器类中;
AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
config.foregroundFPS = 60;
initialize(new MyGdxGame(), config);
我不知道这是新功能还是旧功能。在尝试睡眠之前使用它。
我强烈建议不要通过暂停线程来限制帧,只是为了使所有设备快速或慢速运行的动作保持相同的速度。使用这样的东西在屏幕上移动东西。
x+= speed*Gdx.graphics.getDeltaTime();
祝你在使用libGDX的冒险中好运,看来你刚刚开始。因为当我刚刚开始时,我问的是同样的问题:)
编辑: 以下是提示:
如果您的游戏中存在碰撞,并且用户通过拖动窗口等来休眠游戏,则Gdx.graphics.getDeltaTime()
功能将返回意外的高值。例如2秒而不是你期待的16毫秒(60fps)。在这种情况下,你的角色将通过墙壁跳跃,碰撞检测将失败。所以你可以做到这一点:
我写了一个关于这个主题的页面,它位于我的网站教程部分。看看这个。 nightlybuilddigital.ga
答案 1 :(得分:6)
你不想这样做。
你需要为任何手机制作游戏。
如果你有像
这样的代码player.x+=10f;
您的播放器将在更好的设备上移动得更快.. 您需要按播放时间值移动播放器。
player.x+=Gdx.graphics.getDeltaTime()*300; // this would be ~5f if your device is running with 60 fps
答案 2 :(得分:2)
正如其他人所说,如果你对游戏进行正确的编码,那么更高的fps应该没有什么区别。看一下这篇文章here,找到更好的方法。它不会直接转换为libgdx,但其中的概念都是正确的
答案 3 :(得分:2)
为什么你会暂停线程,当你可以简单地跟踪增量时间并在太快时省略绘图/更新?您可以通过跳过渲染和逻辑更新来以编程方式限制FPS。
尝试这样的事情:
function openPopover(i){
$scope.items[i].isOpen = true;
}
答案 4 :(得分:0)
试试这个c:
if (dt < (1f / max_frames)) {
float sleepTime = (1f / max_frames) - dt;
try {
Thread.sleep((long) sleepTime);
} catch (InterruptedException ex) {
LogTool.logError(ex.getLocalizedMessage());
ex.printStackTrace();
}
}