渲染/更新线程同步

时间:2012-04-18 13:59:52

标签: java android libgdx

我正在和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。所以更新速度绰绰有余。

2 个答案:

答案 0 :(得分:1)

不要使用单独的线程进行更新逻辑,没有理由。

为什么你的更新方法每秒执行5000次,但渲染的上限为60?这是对资源的巨大浪费。

渲染方法的第一行应该调用更新方法。

使用Gdx.graphics.getDeltaTime()获取时差。您可以通过Math.max(1 / 30f, Gdx.graphics.getDeltaTime()更换旧的/缓慢的手机上的生涩感,以获得更平滑但更慢的更新。这将强制最小更新时间为30fps。

答案 1 :(得分:0)

您的数据更新和渲染应该是独立的,而不是synchronized

您的更新功能应该以您确定对用户最友好的速度运行。

它应独立于Render,因为渲染率可能会因最终用户使用的硬件而发生变化。 例如,你不希望你的“怪物”在上一代平板电脑上行走速度快十倍,因此无法播放。

您应该将更新率设置为您选择的常量。 那么如果帧速率非常慢,你可能希望你的更新速率慢一些。

这是我的意见,它会有所帮助。