Суббота, 2017-11-25, 5:01 PM

Поиск
Меню
Категории раздела
Поддержи проект!
Рекомендуем


Потоки

Все методы в ApplicationListener вызываются в одном и том же потоке. Этот поток является потоком визуализации, в котором делаются OpenGL вызовы. Для большинства игр этого достаточно, чтобы реализовать обновление логики и визуализации в render() методе ApplicationListener интерфейса и в потоке визуализации.

Любые операции связанные с графикой и прямым участием OpenGl, должны быть выполнены в потоке визуализации. Делая это в другом потоке может вызвать не предсказуемое поведение приложения. Это связано с тем, что контекст OpenGL находится в активном состоянии только в потоке визуализации. Смена текущего контекста в других потоках имеет проблемы на множестве Android устройств, поэтому это не поддерживается.

Для передачи данных в поток визуализации из другого пока рекомендуется использовать postRunnable() метод из Application. Этим самым выполнение кода в будет в Runnable и в потоке визуализации при следующим кадре, но перед вызовам render() метода ApplicationListener интерфейса.

new Thread(new Runnable() {
   @Override
   public void run() {
      // выполнение чего-либо важного асинхронно потока визуализации
      final Result result = createResult();
      // передача Runnable в поток визуализации, который обработает результат
      Gdx.app.postRunnable(new Runnable() {
         @Override
         public void run() {
            // обработка результата, например добавление в Array поле ApplicationListener.
            results.add(result);
         }
      });
   }
}).start();

HTML5

По своей сути Javascript является однопоточным. Таким образом многопоточность не возможна. В будущем, одним из вариантов может быть Web Workers, однако данные между потоками передаются через сообщения. Java использует другие различные примитивы и механизмы, поэтому перенос кода для Web Workers будет столь прямым.