Androidのレンダリング No comments yet
Android Developers (Google Groups)で、「スケーラブルな画像もサポートしてないのはなぜなんだ」という意見があり、議論が起こったのですが、
Googleで実際にAndroidの開発にあたっているDianne Hackborn(hackbod)氏による返答が非常に面白かったので、勝手に訳してみました。
(多少意訳です。あえて文体は柔らかめにしてあります。)
原文は以下よりどうぞ。
scalable vector graphics scalable vector graphics scalable vector graphics
6年前、以前勤めていた会社では、開発していた携帯のリファレンスモデルは200MHz ARMの32-64MB RAMでした。
現在、AndroidプラットフォームのリファレンスはARM 200-400MHz、64-128MB RAMです。そして、ターゲットは以前と同様、ハイエンドモデルです。
携帯電話のマーケットはPCのそれとは異なります。これは紛れもない事実です。価格やサイズ、バッテリーの持続時間等は、純粋なハードのパフォーマンスより重要になる事が多く、それらは(PCと比べ)ハードウェアのデザインに大きく関与します。
「640Kもあれば、誰でも十分だろう。」という文は誇大に使われています。(訳注:3D機能よりも、2Dを充実させて欲しい、ベクタを使わせて欲しいという事に関して引き合いに出されていた。かつてビルゲイツが言った言葉。)
スケーラブルなグラフィック機能を持たない事は、プラットフォームにとって致命的な事ではありません。実際、あなたの書いた原文は非常に大げさです。AndroidとX-WindowのAthena toolkitとの比較はおかしなことです。Androidの合成エンジン(compositing engine)はX-WindowというよりもずっとMac OS Xに近いのです。
iPhone UIに関するコメントも疑わしいです。私はiPhoneのアーキテクチャに関して詳しくありませんが、あれは3Dハードウェアアクセラレーションを促進しています。(iPhoneで使われているビットマップテクスチャの合成や変形は、OS XでかっこいいアニメーションやUIのトリックに使われているものであるため。)
これは、今日広く使われているグラフィックスアクセラレーションハードは、ビットマップテクスチャの変形や合成が非常に得意であり、2Dのスケーラブル画像のレンダリングには特化されていないから、という理由があります。iPhone UIとAndroidのクオリティの比較はスケーラブルグラフィックスとは何の関係もありません。 iPhoneのソフトは全て統一された画質の単一のデバイス(iPhone)で動作するので、スケーラブルなグラフィックスによる恩恵はほとんどないでしょう。ウェブブラウザでズームインやズームアウトをしたいときにはスケーリング機能は便利ですね。二つとも丁度WebKitですし。
でも、スケーリングや変形効果を使ったアニメーションに関しては、スムーズに見せる為のベストな方法はビットマップ(ベクタではなく)を使うことです。iPhoneが滑らかな動作を見せる原因の一つは、それらのアニメーションを60fpsで動かすために非常に時間を費やしているから、そしてそれらは全てを3Dハードウェアアクセラレーション上のテクスチャレンダリングで行っているのです。Androidは、レイアウトレベルでの画質解像度情報が組み込まれているので、開発者が様々な単位(実際のピクセル数、実際のインチ、スケールされたピクセル数、フォントスケールの単位等)で指定できます。 そうすれば、レイアウトで1ピクセルの厚さのラインが欲しいすると、それは実際の画面に合わせたサイズに(1ピクセルや2ピクセル等)に自動的に変換されます。
Appleには、「多少ピクセルがぼける事を犠牲の上で、アンチエイリアスを大量に使うことで線のポジションをよりきれいに表示する」という美学があり、UIはそうデザインされています。
しかし、非常に多くの人々がこれを好む一方で、また多くの人々が、ヒンティングとアライニングを用いた事でアンチエイリアスのインパクトを減衰させたレンダリングを好んでいます。ここで「どちらが正しい方法か」を提案するのは非常に難しいです。ともかくAndroidに関しては、いくらかのヒンティングをフォントレンダリングに用いたことでクッキリしたテキストを表示する事にしています。そして同様に、解像度調整がビューレイアウト、実2Dレンダの順に行われるので、ピクセル境界が調整できます。実際のところ、私の知る限りでは、モバイル開発者の欲求は以下の三つです。
1. 可能な限り高解像度。
2. 必要最低限のCPU。(価格やバッテリーの為)
3. 3D ハードウェアアクセラレータこのような環境においては、スケーラブル(ベクタ)グラフィックスのものよりラスタ(ビットマップ)ベースのUIの方がはるかに優先されます。それはあらゆる滑らかなレンダリングにおいて3Dアクセラレータを使用することになるからです。CPUは非力なので十分ではないのです。この構成は効率的にベクタ画像を描画できないのです。