我正在制作一款游戏,我在一些(奇怪的)低端android设备(Galaxy S mini, Galaxy ACE)上遇到了问题,这些设备的硬件实际上很糟糕。这两款设备的FPS都是85+,而在其他设备(HTC Desire、索尼Xperia Arc S、三星Galaxy S、HTC Wildfire)上,FPS是"正常"的(大约60FPS)。电脑上也显示60帧每秒。显然85+ FPS太多了,因为游戏体验是不同的,这可能会给那些玩85+ FPS的玩家带来不公平的优势。
我想把FPS限制在MAX 60。
我已经搜索了这个论坛,我已经找到了我现在要问的确切问题。在Libgdx游戏中限制FPS, Thread.sleep()不工作
用户@daniel给出的(可接受的)解决方案是这样的:
Thread.sleep((long)(1000/30-Gdx.graphics.getDeltaTime()));
但问题是这对我不起作用。如果我使用该代码(将30替换为60),我将获得30-33 FPS,或者如果我只使用Daniel的代码,我将获得15-17 FPS。为什么是这样,为什么对我不起作用?如何将所有设备上的FPS限制在MAX 60 ?我在电脑和其他设备上测试了这段代码。
任何帮助高度赞赏。谢谢你。
在启动器类中;
AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
config.foregroundFPS = 60;
initialize(new MyGdxGame(), config);
我不知道这是新功能还是旧功能。在尝试休眠线程之前使用此选项。
我强烈建议不要通过休眠线程来限制帧数,只是为了保持所有设备快速或慢速运行时的运动速度相同。使用类似这样的东西来移动屏幕上的东西。
x+= speed*Gdx.graphics.getDeltaTime();
祝你在libGDX的冒险中好运,似乎你才刚刚开始。因为当我刚开始工作的时候,我也问过同样的问题:)
编辑:这是一个提示:
如果你的游戏中有碰撞,如果用户通过拖拽窗口让游戏休眠等等。Gdx.graphics.getDeltaTime()
函数将返回一个意外的高值。例如,2秒而不是你期望的16毫秒(60fps)。在这种情况下,你的角色将跳跃,穿过墙壁,碰撞检测将失败。下面是你可以做的:
- 你可以覆盖该函数,或者取最后10帧的平均值并返回该值(在某些情况下它有一点缺陷,但在其他一些情况下它更好)。
- 如果该值大于30秒,则返回30毫秒。所以角色不会跳,不会穿墙……即使玩家睡了一个世纪。
- 结合。(最好)当取平均值时,不要计算超过30毫秒的值。
我写了一个关于这个主题的页面,它在我的网站教程部分。看看吧。nightlybuilddigital.ga
你不会想这么做的。
你需要为任何手机制作游戏。
如果你有一个像
这样的代码player.x+=10f;
你的播放器会在更好的设备上移动得更快。你需要移动你的球员的增量时间值。
player.x+=Gdx.graphics.getDeltaTime()*300; // this would be ~5f if your device is running with 60 fps
为什么你甚至暂停线程,当你可以简单地跟踪增量时间和省略绘图/更新时,它太快了?你可以通过跳过渲染和逻辑更新来限制FPS。
试试这样写:
private static final float MIN_FRAME_LENGTH = 1f/60f;
private float timeSinceLastRender;
/** @param delta time since the last render call. */
public void render(float delta) {
timeSinceLastRender += delta;
if (timeSinceLastRender >= MIN_FRAME_LENGTH) {
// Do the actual rendering, pass timeSinceLastRender as delta time.
timeSinceLastRender = 0f;
}
}
正如其他人所说,如果你的游戏编码正确,那么更高的fps并不会带来什么不同。看看这里的这篇文章,了解更好的方法。它不会直接翻译成libgdx,但其中的概念都是正确的
试试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();
}
}