2007年04月07日

D800iDSレビューその2:iアプリ性能、タッチパネルでゲームは少し厳しい

D800iDSのiアプリの性能についてですが、なんたってDSですから、ニンテンドーDSみたいなゲームが遊べると期待しますよね。
実際、先日結果が発表された「FOMA D800iDS 2画面iアプリコンテスト」でも入賞作はほとんどゲームで、自分もまあ“ゲームっぽいもの”で佳作をいただきました。プリインストールのiアプリにもニンテンドーDSの「大人のゴルフ」的なゴルフのゲームがあります。

自分も実際にiアプリを開発するまでは「この携帯でニンテンドーDSみたいなゲームが作れるし遊べるしイヤッホーイ」とわくわくしていましたが、それはちょっと微妙でした。その理由とD800iDSの詳しいiアプリ性能を以下に書きます。

まず開発に必要な資料やツールはこちらでダウンロードできます。 ドキュメントからTouchCanvasというフレームワークまで全部揃います。

FOMA D800iDS用 iアプリ作成関連ドキュメント
http://www.mitsubishielectric.co.jp/mobile/ds_iappli/development.html

D800iDSのiアプリのDoJaプロファイルバージョンは4.1-LEです。従ってメガiアプリには対応しませんが、JARに100KB、スクラッチパッドに400KB使えるので、サイズ的には十分かと。CLDCも1.1なので、浮動小数doubleやfloatが使えます。タッチパネルを生かしたアプリを作る時、座標計算したりが実数でできるので便利です。
メインディスプレイの解像度は240x240、タッチパネルとなるサブディスプレイは240x320と、サブディスプレイの方が広くなっています。まあタッチする領域が広く使えるので問題ないです。またフォントサイズも12, 16, 24, 30で普通です。Javaヒープ領域などもサイズも同クラスの機種と比べて別段劣る点はありません。

タッチパネルへの描画

さて、肝心のタッチパネルをプログラムからどうやって扱うかですが、特別な仕組みはまったく用意されておらず、DoJaのオプションAPIとして規定されている「サブディスプレイ」の扱いになります。従ってcom.nttdocomo.opt.ui.SubDisplayクラスを使って操作します。なんとメインディスプレイより大きいサブディスプレイ、しかもタッチパネルのくせに、プログラムからはSubDisplay#setImage(com.nttdocomo.ui.Image )メソッドを使った全面一括置き換えのメソッドしかないのです。じゃあ下画面での部分描画やアニメーションはどうやるのかというと、バッファというか、オフスクリーン的な仕組みを自分で作って、Imageクラスへ描画し、それをSubDisplay#setImageするしかありません。

さらにあり得ないことに、このサブディスプレイの描画に対する応答速度、10msもかかります。503iが出た頃のiアプリ並です。下画面でお絵描きさせるようなアプリを作ろうとしても、ペンでなぞる速度に描画がついて行けず、なぞった後ワンテンポ送れてから画面上に描かれます。これではどう頑張っても気持ちよく動くお絵描きアプリは作れません。

本体にプリインストールされているゴルフゲーム「すらいどゴルフ」ではサブディスプレイでゴルフクラブのヘッドをドラッグしてショットしますが、やはりヘッドは送れてついてきます。
端末にネイティブの機能として搭載されている「ペイント」でも、文字を書くように素早くペンを動かすと描画と反応がついてこれず、直線で結んだような文字になってしまいます。当然ですがニンテンドーDSなら同じくらいの早さでペンを動かしてもスムーズに描けます。

タッチパネル上の操作への応答

サブディスプレイの描画処理が貧弱なことがわかりましたが、じゃあタッチ操作への応答はどういう仕組みになっているかというと、これまた特別な仕組みはなく、オプションAPIにあるPointingDeviceクラスを使います。
このクラスは普通ならメインディスプレイに対するポインタを持つ端末、つまりメインディスプレイがタッチパネルになっているF900iTとか、マウス的なポインティングデバイスを持つN900i以降のNシリーズとかで使うクラスですが、D800iDSではサブディスプレイへのタッチ操作をこのクラスから取得することができます。マウスモードとしてのみ動作し、PointingDevice#getX(), PointingDevice#getY()メソッドでタッチしている座標を得ることができます。タッチしているか/いないかは取得できません。どうするかというとタッチする動作は決定キーとして動作するようで、タッチした時にDisplay#KEY_PRESSED_EVENT、離した時にDisplay#KEY_RELEASED_EVENTがDisplay#KEY_SELECTをパラメータとしてそれぞれ発生します。タッチしながら動かしてもイベントは特に発生せず、自分で定期的にPointingDevice#getX(), getY()メソッドで位置を取得する必要があります。

なおタッチパネルへの描画方法と操作への応答については作成関連ドキュメントの「タッチパネルについて」というPDF(pannel.pdf)が詳しいです。

ドキュメント タッチパネルについて(PDF)
http://www.mitsubishielectric.co.jp/mobile/ds_iappli/data/pannel.pdf

とまあこんな感じで、既存の仕組みに無理矢理タッチパネルを持ち込んだ感じなので実にやりにくいです。さすがにこれだけでは開発もやりづらいと思ったのか、作成関連ドキュメントには「タッチパネル制御を簡易に行えるフレームワーク」としてTouchCanvasというクラスが提供されています。これを使えばタッチした時にイベントを通知してくれたり、サブディスプレイの部分描画をやりやすくしてくれます。
ただし名前の通りCanvasの派生クラスです。自分はiアプリを作る時は自前のCanvas派生クラスを使うので、TouchCanvasの導入を考えた場合は自前のCanvasクラスにTouchCanvasのような機能を持たせる方が楽でした。

ちなみに2画面iアプリコンテストの審査員賞の中に「The Simple カーリング」というのがありまして、その名の通りカーリングゲームなのですが、ゲームはすごくおもしろいのにやはりこのサブディスプレイの応答の遅さで損をしている感じです。これがもっとスムーズに動いたら市販のゲームと変わりません。
大賞の「左右反転間違い探し」は静止画の間違い探しなので速度が要求されず、サブディスプレイの応答速度が気になりません。D800iDSの弱点をうまくカバーしていてさすがだなーって感じです。

背面のイルミネーションLEDは使用不可

それから時刻や電波状況をオシャレに表示してくれる背面のイルミネーションLEDですが、iアプリ側から点灯させたり描画したりすることはできません。残念です。

ITmedia +D モバイル:これぞ“UIレボリューション”――2画面ケータイ「D800iDS」の持つ可能性 (3/3)
http://plusd.itmedia.co.jp/mobile/articles/0702/08/news100_3.html

上記のインタビュー記事では“ユーザーが任意に入力した文字を背面に表示させることができるアプリも配信予定だ”とありますが、これは別にiアプリからイルミネーションLEDを操作して好きな文字を表示させるわけではありません。
この「LED Maker」というiアプリはすでに配布されていますが、端末を閉じる時のイルミネーションに設定できるGIF画像を作成するiアプリに過ぎず、そのiアプリから背面のLEDは一切操作しません。プレビューすらできないです。下記の記事にありますが、あくまで「クローズイルミネーションパターン」(端末を閉じた時に表示するアニメーション)用のGIFを作成できるだけです。

ITmedia +D モバイル:背面に好きな文字を表示させる方法は?――「D800iDS」
http://plusd.itmedia.co.jp/mobile/articles/0702/27/news087.html
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。