2017/07/06

libgdx いじり

Google が提供している Java 版の Tango Examples は Rajawali をベースにしているため、自分が仕事で開発する Tango アプリも Rajawali ベースとしていましたが、最近は libGDX への移行を進めています。一応、要点については移行が済んだかな、と。

libGDX

libgdx/libgdx | GitHub

しばらく前には、Rajawali の品質が酷すぎるという事で、3D フレームワーク (エンジン) を自作しようと試みてもいましたが、あらためて 3D フレームワーク を調査していたら libGDX を見付け、そのクラス設計を眺めていたら非常に綺麗であったので、強く惹かれたという感じです。位置付け的には XNA Framework + α という印象ですね。

後は、調べてみると libGDX は Ingress で採用されているようでした。

IngressでもlibGDXが利用されているのをご存知でしたか? | Qiita

Ingress の後に登場した Pokemon GO は、Unity で実装されているとの情報を海外掲示板サイトなどで見かけましたが、libGDX でIngress を開発したという事例だけでも品質として心強いなぁと。

そこで、libGDX による Tango アプリ開発をネットで調べると・・・情報がほぼ無い。とは言え、Java による Android 開発の視点では、Tango もただの  Java ライブラリの 1 つでしかなく、OpenGL をベースに 1 つづつ考えればやれるだろうと考え、libGDX の基礎から始めていました。

でまぁ、やり始めると早いですね。libGDX 自体の情報は豊富ですから (ただし、英語)。

Android Studio 用プロジェクトは libGDX に付随のツールで行えるので、これをベースに Tango を加える事を考えるだけです。

libGDX 付随のツールが生成する Android Studio プロジェクトに含まれる build.gradle は、libGDX 式のフォルダ階層への対応や、不要な定義が含まれているため、一見では、複雑な事をしているかの如く見えます。
しかし、要点は、libGDX に含まれる JNI ライブラリへの依存関係を適切に記述し、apk ファイルに含まれるようにする定義のみです。build.gradle の内容を正確に理解すれば、わざわざツールでプロジェクトを生成せずとも、Android Studio で新規生成したプロジェクトに対して libGDX のための定義を加えるだけで済むことが分かります。
この辺りのサンプルは、時間があれば GitHub などで公開する・・・かもしれません。

後は、僕が対象としているアプリは Android 前提であるため・・・と言うか、現状では Tango の利用は Android が前提となるため、クロスプラットフォーム開発の概念は捨て、ネットワーク処理を始めとした非グラフィックス処理は AndroidApplication (libGDX の Activity) のサブクラスで行い、グラフィックス処理は ApplicationListener (libGDX のグラフィックス処理) で実装するように切り分けています。また、AndroidApplication サブクラスでは、ApplicationListener のロジックに関係するロジックのみを実装し、一般的な Android の画面を用いる場合には、別途、Activity を定義して startActivity などをするようにしています。

ただまぁ、ゲーム的なアプリを始めとした、GUI を自前でゴリゴリ書くような Tango アプリを開発するのであれば、Unity 版で開発するのが最善であろうかと思います。
Java では、GC 回避の手段がプーリングや作業用インスタンス変数などしかなく、それらはコードの可読性を極めて低下させ、くだらないバグを引き起こしやすいです。

しかしながら、Android 開発経験者の殆どは Java 開発であろうと思います。まずは Tango を使ってみたいという場合には、Java で書いてみるのが良い気がします。まずは、動く物を作って、自身のモチベーションを上げていく事が重要ですからね。

libgdx いじり

Google が提供している Java 版の Tango Examples は Rajawali をベースにしているため、自分が仕事で開発する Tango アプリも Rajawali ベースとしていましたが、最近は libGDX への移行を進めています。一応、要点については移行が...