雑念日記

主に技術的なことをつらとらと(書ければいいな)。

Android は DXRuby の夢を見るか

f:id:hoshi_sano:20151123161633j:plain

本投稿は DXRuby Advent Calendar 2015 2日目の記事です。
タイトルに深い意味はありません。あえて言うなら文脈的に Android と DXRuby の位置は逆な気がする。

1日目はあおいたくさんの DXRubyの「いま」をおさらい でした。毎年 AC 主催していただいてありがとうございます。自分もまとめられるような何かをつくらねばと思わせてくださる記事でした。つくらねば...

さて、それでは2日目の内容に入ります。

記事の内容をひとことで表すと

DXRuby 用に書かれたコードを Android 上で動かしてみるという試み。

結果

ともかくコイツを見てくだされ〜

f:id:hoshi_sano:20151124144524j:plain

f:id:hoshi_sano:20151125010541p:plain

動作確認には DXRuby のサンプル STG をお借りしました。
コードの改変なしでも動きますが、自機の操作やショット判定処理は Android 向けに以下のように変更させていただきました。

  • 画面にタッチした位置に向かって自機が移動
    • Input.mouse_down? と Input.mouse_pos_{x,y} を利用
  • 画面にタッチしている間はショット
    • Input.mouse_down? を利用

ただし後述する互換ライブラリに未実装の処理があるため、音の再生などが動作していません。

ソースコードはこちら。(サンプルコード除く)

github.com

概要

Andorid アプリ開発には Google から Java プラットフォーム向けの SDK などが提供されており、一般的に Javaアプリ開発することが多いみたいです。

そんな中、JRuby を使った Android アプリ開発フレームワークを提供する Ruboto というプロジェクトがあります。 Ruboto によって AndroidRuby のコードが動かせるようになります。

f:id:hoshi_sano:20151123164534j:plain

一方、Processing という アート、視覚化、ゲームといった分野に特化したJava ベースのプログラミング言語/環境/ツールがあるのですが、その Processing には Android 向けのライブラリ(.jar)も用意されています。

f:id:hoshi_sano:20151123170244j:plain

これも Ruboto を使うと Processing 向けに書いた Ruby のコードが Android 上で動かせるようになります。

f:id:hoshi_sano:20151123170042j:plain

Processing を Ruboto で動かす話は以下の記事に詳しく書きました。

hoshi-sano.hatenablog.com

Ruboto + Processing によって、Android 上で動くアートやゲームなコードが Ruby で簡単に書けるようになりました。

あとは DXRuby の API の内部動作を Processing に差し換えるような互換ライブラリを作ってしまえば Android 上で動く DXRuby の実現完了です。

f:id:hoshi_sano:20151123204259j:plain

よいところ

DXRuby のコードが基本そのまま動きます。(互換ライブラリの実装を頑張れば)
すなわち Android の仕組みをよく知らなくても Android で動作するゲームが作れちゃいます。(Android アプリをビルドできる環境は必要ですが)

また Ruboto で作ったアプリはストアにも置けるらしいので、DXRuby で作ったゲームを Google Play ストアとかで公開して皆に遊んでもらうことができます。(という夢が見られます)

わるいところ

DXRuby の強みである「高速」性がかなり失われています。というかもうすげー遅いです。
互換ライブラリの実装がイケてないという点もそれなりにあるでしょうが、それにしたって遅い。
上に載せた動画は見ての通りエミュレータで動作させたものでこれはまぁそれなりの速度なのですが、実機で動かすととんでもないです。
どのくらい遅いかというと 2 fps くらい。試した端末が FREETEL Priori3 という廉価端末なのでスペックがわりと貧弱ではあるのですが、それでもレビューブログなんかを見るとパズドラとかモンストとかはそれなりに動くらしいので端末毎のスペック云々という話でもなさそう。

またエミュレータでも Android のバージョンによっては結構遅いです。
Android 4.x までは Dalvik という仮想マシンが使われているのですが、これで今回のアプリを動かすとコンカレント GC が頻発しちゃって 10 fps くらいになってしまいました。Android 5.0 以降で正式サポートされた ART を使うと、上に貼った動画のようにまぁまぁ見れる状態にはなりました。

あと動画を見てわかるように起動も遅い。これは各所で指摘されてるように Ruboto の(というか JRuby の)起動が遅いという点もあるけど、その後のライブラリ読み込んだり画像データ読み込んだりオブジェクト作ったりも結構遅いと思われます。

Processing の使い方が悪いのか、そもそも構成が悪いのか、あまり考察はできてませんがとりあえず言えることは現段階では実用的ではない感じ。

キッカケとかモチベーションとか

できそうだからやってみました。(小並)

もうちょっと言うと、以前 DXRuby の互換ライブラリとして dxruby_rp5 というのを作ったことがありまして。(これも「できそうだからやってみた」シリーズ)

hoshi-sano.hatenablog.com

このとき既に dxruby_sdl というもっと互換性の高いライブラリがあったわけですが、自分の手元で DXRuby 用のコードを動かす分にはわが子可愛さに rp5 の方をまぁまぁ使ったりしながら機能を追加してたりしたわけです。
すると去年の Advent Calendar で皆さんもご存知こういったものが登場しました。

qiita.com

これにより自分の中でもいよいよ dxruby_rp5 もお役御免だなぁとなったわけですが、せっかく書いたコードが無駄になるのもアレに思いまして、なんか利用方法はないかなと考えてみたのです。

dxruby_rp5 の特徴としては、描画に Processing が使われていて、Processing が Java ベースなので、つまり乱暴に言ってしまえば DXRuby 用のコードが Java で動いているということになる。

なら Android でも動かせるのでは?

    |
  \ _ /
 _ (m) _
    目   ピコーン
  / `′ \
   ∧_∧
   (・∀・∩
   (つ ノ
   ⊂_ノ
    (_)

というわけで今回使った互換ライブラリには dxruby_rp5 のコードがほぼ流用されています。(Input まわりは Android 向けに結構修正せざるを得ませんでしたが。あと 未実装ですが Sound まわりも Android 向けに修正が必要ですね。)

なので、実は今回 DXRuby 用のコードを Android で動かすにあたって新しく書いたコードってあんまりないです。基本的には以下の2つの組合せでなんとかなりました。

...けど、結局使い物にはならなかったので、楽をするだけではダメっつーことですね。

終わりに

結論。
DXRuby 用に書かれたコードを Android で動かすことができました。
けど、問題点改善点は多く、実用には遠く及ばずでした。
この先これをどうするかとかは今はまだあまり考えてません。
ご清覧いただきありがとうございました。

明日3日目は土屋つかささんです。1日目の記事でも紹介のあった司エンジンの記事を書いてくださるみたいです。楽しみですね。