Требуется использование продолжений в игровом фреймворке - PullRequest
2 голосов
/ 02 октября 2011

Можете ли вы дать мне несколько ссылок с хорошими примерами того, как использовать продолжения в игровой среде? (Кроме источника игровой среды, их «образцы-и-тесты» и документация на месте уже были)

Любая документация и теория в формате "для чайников" также приветствуются.

1 Ответ

7 голосов
/ 02 октября 2011

Продолжения работают в основном с использованием метода await(), который доступен через ваш контроллер. Метод await может принимать два разных типа параметров (в действительности существует 6 перегрузок метода, но они представляют собой простые варианты для двух тем).

Первый звонок ждут с тайм-аутом. Это может быть в миллисекундах или может быть указано с использованием строкового литерала, выражающего время, например, 1s за 1 секунду и т. Д.

Второй - вызов await с объектом Future, и чаще всего он использует реализацию Play будущего Java, называемого Promise (в libs.F). Обещание возвращается, когда обещание выполнено, в том случае, если событие, которое вызывается как часть Обещания, завершено. Однако Обещание может быть больше, чем одно событие, это может быть несколько событий. Есть даже варианты, чтобы сказать waitAny, чтобы он ожидал только одного из множества событий.

Итак, оба подхода в основном приводят к тому, что событие происходит в какой-то момент в будущем. Первое предопределено, второе зависит от того, сколько времени потребуется для выполнения Обещания.

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

// do some logic
await(timeout or promise);
// continue the execution

За кулисами освобождается поток HTTP, поэтому Play может обрабатывать больше одновременных запросов более эффективно. И когда тайм-аут или обещание выполнены, метод продолжает выполняться, без необходимости кодировать какую-либо конкретную обработку для потока выполнения, запускающегося снова.

Принимая код с сайта Play для продолжения, он говорит:

public static void loopWithoutBlocking() {
    for(int i=0; i<=10; i++) { 
         Logger.info(i);
         await("1s");
    }
    renderText("Loop finished");
}

Это фактически завершает поток выполнения 10 раз и запускает новый поток через 1 секунду ожидания. Все это совершенно прозрачно с точки зрения программистов и позволяет создавать приложения интуитивно, не беспокоясь о создании неблокирующих приложений, поскольку все это волшебным образом обрабатывается Play!

...