Синхронизация потоков рендеринга/обновления

Я пишу небольшую игру с Libgdx.

У меня есть поток Render[OpenGL], который продолжает вызывать render() для всех объектов, и поток обновления, который продолжает вызывать 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 кадров в секунду. Так что скорости обновления более чем достаточно.


person jellyfication    schedule 18.04.2012    source источник


Ответы (2)


Ваше обновление данных и ваш рендеринг должны быть независимыми, а не synchronized.

Ваша функция обновления должна работать со скоростью, которая, по вашему мнению, будет наиболее удобной для пользователя.

Он должен быть независим от рендеринга, поскольку скорость рендеринга может меняться в зависимости от аппаратного обеспечения, используемого конечным пользователем. И, например, вы не хотите, чтобы ваш «монстр» ходил в десять раз быстрее на планшете последнего поколения, чтобы он стал неиграбельным.

Вы должны установить частоту обновления на выбранную вами константу. Тогда, возможно, вы захотите немного замедлить скорость обновления, если частота кадров действительно низкая.

Это мое мнение, надеюсь поможет.

person Michael Laffargue    schedule 18.04.2012
comment
Что вы подразумеваете под самой удобной скоростью обновления? Мое обновление выполняется так быстро, как только может превысить минимальный шаг. Обновить рабочие процессы с заданной дельтой, чтобы скорость монстра была такой же? - person jellyfication; 18.04.2012

Не используйте отдельный поток для логики обновления, для этого просто нет причин.

Почему ваш метод обновления выполняется 5000 раз в секунду, а рендеринг ограничен 60? Это огромная трата ресурсов.

Первая строка вашего метода рендеринга должна называться вашим методом обновления.

Используйте Gdx.graphics.getDeltaTime(), чтобы получить разницу во времени. Вы можете обменять рывки на старых/вялых телефонах на более плавные, но более медленные обновления с помощью Math.max(1 / 30f, Gdx.graphics.getDeltaTime(). Это приведет к минимальному времени обновления 30 кадров в секунду.

person Richard Taylor    schedule 22.04.2012