2012-04-18 5 views
0

Я пишу небольшую игру с Libgdx.Render/Update Thread synchronization

У меня есть поток aRender [OpenGL], который вызывает вызовы render() для всех объектов и Обновить поток, который продолжает звонить update(double delta) по всем объектам.

Обновление потока происходит быстрее. Должен ли я попытаться использовать какую-то синхронизацию, чтобы поток обновления мог немного отдохнуть? Были ли какие-либо выгоды от этого?

Update

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 кадров в секунду. Таким образом, скорость обновления более чем достаточна.

ответ

0

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

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

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

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

Это мое мнение, что это поможет.

+0

Что вы подразумеваете под "самой удобной скоростью обновления"? Мое обновление работает так же быстро, как может быть выше минимального шага. Обновление woks с заданной дельтой, так что скорость монстра будет одинаковой? – jellyfication

1

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

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

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

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