Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> пояснение игрового цикла, while(running) { } 
:(
    Опции темы
isalex678
Дата 12.10.2011, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 6.10.2011

Репутация: нет
Всего: нет



Поясните игровой цикл.
за что отвечают переменные:
averagePassedTime, naiveTiming
для чего надо alpha и какое её назначение
Thread.sleep(8); почему 8?
многое непонятно.
где почитать на русском про игровые циклы.

Код

public class test2 {

    public static final int TICKS_PER_SECOND = 24;
    
    VolatileImage image = createVolatileImage(320, 240);
    Graphics g = getGraphics();
    Graphics og = image.getGraphics();

    int lastTick = -1;
    int renderedFrames = 0;
    int fps = 0;
    double time = System.nanoTime() / 1000000000.0;
    double now = time;
    double averagePassedTime = 0;
    boolean naiveTiming = true;

    while (running) {
        double lastTime = time;
        time = System.nanoTime() / 1000000000.0;
        double passedTime = time - lastTime;

        if (passedTime < 0) naiveTiming = false; 
        // Stop relying on nanotime if it starts skipping around in time 
        // (ie running backwards at least once). This sometimes happens on dual core amds.
        averagePassedTime = averagePassedTime * 0.9 + passedTime * 0.1;

        if (naiveTiming) {
            now = time;
        } else {
            now += averagePassedTime;
        }

        int tick = (int) (now * TICKS_PER_SECOND);
        if (lastTick == -1) lastTick = tick;
        while (lastTick < tick) {
            scene.tick();
            lastTick++;

            if (lastTick % TICKS_PER_SECOND == 0) {
                fps = renderedFrames;
                renderedFrames = 0;
            }
        }

        float alpha = (float) (now * TICKS_PER_SECOND - tick);

        sound.clientTick(alpha);
        scene.render(og, alpha);

        og.setColor(Color.BLACK);
        drawString(og, "FPS: " + fps, 5, 5, 0);

        g.drawImage(image, 0, 0, 640, 480, null);
        renderedFrames++;
        Thread.sleep(8);
    }
    
}



зачем надо было запускать дополнительный поток ?
подставляю this.run() - без него работает (может автор что то хотел сказать)

Код

public void start()
{
    if (!running)
    {
        running = true;
        new Thread(this, "Game Thread").start();
    }
}





PM MAIL   Вверх
Nofate
Дата 12.10.2011, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 266
Регистрация: 13.10.2008

Репутация: 4
Всего: 8



Ну там же все расписано в комментариях. 
В начала каждого прохода цикла, мы замеряем время, прошедшее с предыдущего прохода. Т.е., грубо говоря, на сколько должно продвинуться игровое время. Если замеренная величина меньше ноля (судя по комментариям автора это случается на двухъядерных процах от AMD), то отказываемся от "наивного" замера времени и ориентириуемся на среднее время выполнения цикла (а именно на взвешенную сумму среднего времени и измеренного времени в соотношении). 

Дальше секунды переводятся в тики, идет судя по всему отрисовка сцены, выводится FPS. Alpha - это количество тиков, на которое проматывается игровое время.

Thread.sleep(8) добавляет в каждый цикл задержку и, таким образом, ограничивает минимальное время выполнения цикла. Это делается для того, чтобы не перерисовывать сцену слишком часто и снижает нагрузку на процессор. Число 8 автор, скорее всего, подобрал эмпирически. Я, например, для некритичных обновлений нередко использую 100-200 мс.

Про использование потока сказать что-то конкретное трудно вне контекста остальной программы. Но, видимо, раз автор его использовал, значит зачем-то это было нужно, не так ли?

Читать про игровые циклы особо нечего. Все, как правило, идет по стандартной схеме: вычисляем прошедшее время, обновляем состояние игровых объектов и подсистем (физика, геймплей, гуй,  звук, мышиноклавиатурный ввод), рисуем очередной кадр.   


--------------------
The future is not set, there is no fate but what we make for ourselves.
Нофейтово пространство и смежные области 
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0401 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.