我正在和Libgdx一起写一个小游戏。
我有一个继续在所有对象上调用render()
的aRender [OpenGL]线程
更新一直在所有对象上调用update(double delta)
的线程。
更新线程的循环速度更快。我应该尝试使用某种同步,以便更新线程可以休息一下吗? 会有什么好处吗?
更新
public void run() {
while(true){
nano = System.nanoTime();
long delta = nano - timestamp;
timestamp = nano;
accumulator+=(double)delta/BILION;
while(accumulator >= step){
update(step);
accumulator-=step;
}
long loc = (long) ((step -accumulator)*1000)+1;
try {
Thread.sleep(loc);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
我不知道它是否有问题,但我目前的更新是2500-20000 fps。所以更新速度绰绰有余。
答案 0 :(得分:1)
不要使用单独的线程进行更新逻辑,没有理由。
为什么你的更新方法每秒执行5000次,但渲染的上限为60?这是对资源的巨大浪费。
渲染方法的第一行应该调用更新方法。
使用Gdx.graphics.getDeltaTime()
获取时差。您可以通过Math.max(1 / 30f, Gdx.graphics.getDeltaTime()
更换旧的/缓慢的手机上的生涩感,以获得更平滑但更慢的更新。这将强制最小更新时间为30fps。
答案 1 :(得分:0)
您的数据更新和渲染应该是独立的,而不是synchronized
。
您的更新功能应该以您确定对用户最友好的速度运行。
它应独立于Render,因为渲染率可能会因最终用户使用的硬件而发生变化。 例如,你不希望你的“怪物”在上一代平板电脑上行走速度快十倍,因此无法播放。
您应该将更新率设置为您选择的常量。 那么如果帧速率非常慢,你可能希望你的更新速率慢一些。
这是我的意见,它会有所帮助。