サイトのトップへ戻る

libGDX ドキュメント 日本語訳

サイト内検索

スレッド処理

ApplicationListenerのメソッドは全て、同一スレッド上で呼び出されます。 このスレッドは、OpenGLの呼び出しを行うことができる描写用スレッドです。 ほとんどのゲームでは、ApplicationListener.render()メソッド内と描写スレッド上でロジックの更新と描写を両方実装すれば十分です。

OpenGL を直接叩くグラフィック処理は描写スレッド上で実行する必要があります。異なるスレッド上で実行すると、未定義動作となってしまいます。 これは、OpenGL のコンテキストが描写スレッドでのみ有効になっているからです。 別のスレッドでコンテキストを作成するとAndroid 端末の多くで問題が発生するので、そういった動きはサポートされていません。

他のスレッドから描写スレッドへデータを渡すには、Application.postRunnable()の使用をお勧めします。 これは、ApplicationListener.render()が呼び出される前、次のフレームの描写スレッドのRunnable内でコードを実行します。

new Thread(new Runnable() {
   @Override
   public void run() {
      // do something important here, asynchronously to the rendering thread
      final Result result = createResult();
      // post a Runnable to the rendering thread that processes the result
      Gdx.app.postRunnable(new Runnable() {
         @Override
         public void run() {
            // process the result, e.g. add it to an Array<Result> field of the ApplicationListener.
            results.add(result);
         }
      });
   }
}).start();


libgdxのクラスはスレッドセーフですか?

クラスドキュメントでスレッドセーフとして明示的にマークしていない限り、 libgdx のクラスはスレッドセーフではありません。

例えば複数のスレッドからscene2D コンポーネントを使用するなど、graphics やaudio 関連のものでマルチスレッド操作を行わないでください。



HTML5

JavaScript は本質的にシングルスレッドです。そういうものですから、スレッド処理は不可能です。 将来的にはWeb Workers が選択肢になるかもしれませんが、 Web Workersではデータはスレッド間を行き来するメッセージを使って渡されます。 Javaはスレッド処理ではこれとは異なる基底メカニズムを使用しているので、スレッド処理のコードを Web Workers へ移植するのは簡単ではないでしょう。

前へ | 次へ