Все методы в 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<Result> поле ApplicationListener. results.add(result); } }); } }).start();
HTML5
По своей сути Javascript является однопоточным. Таким образом, многопоточность не возможна. В будущем, одним из вариантов может быть Web Workers, однако данные между потоками передаются через сообщения. Java использует другие примитивы и механизмы, поэтому перенос кода для Web Workers будет не столь прямым.