おはようございます? 今回は設計レイヤーの話についていろいろしたいと思います。
概要
- 描画レイヤー
- 文字描画レイヤー
- イベントベース
- 画像レイヤー
- 動画レイヤー
- 音声レイヤー
- まとめ
1. 描画レイヤー
OpenGL Utility Toolkit (OLUT) を使おうかと思います。ただし、ある程度は Platform 特有の命令でラップすることになると思います。
描画レイヤーに関してですが、
- [Phase I] とりあえずクロスプラットフォームで動かすために OSS プロダクトに投げまくる。
- [Phase II] プラットフォームの固有のものを独自実装し、うまく扱えるようにする。
といった感じです。たとえば Windows だと Win32、OS X/iOS だと Cocoa、という感じになります。Linux はよくわからないので、たぶん GLUT に投げる形になるんじゃないかな、って。
2. 文字描画レイヤー
気になって調べたのですが (まあ Blink エンジンの開発でも使用かな、ってときある程度知識自体は仕入れてたりしたんで)、freetype と FTGL (Freetype on OpenGL) あたりを初期に使います。↑で書いていた通り、こちらも将来的に Windows では DirectWrite、OS X/iOS だと CoreText あたりに投げる感じです。
文字描画は一番大事な機能で、できるだけきれいに美しく描画する必要があると考えています。ただ、きれい、だけではなくパフォーマンスを求められる部分でもあるので、OS の各 API に投げる価値はあると考えています。ただ、Windows の場合 WPF/WinRT があるので果たしてここまでコストをかけるべきなのが、これはコミュニティーで検討していくべき事項になるでしょう。
3. イベントベース
これは Rx で決まりです。Rx は今や様々な言語で使われており、非常に便利です。
問題点としては言語を超える必要があるので、そのあたりの仕様をきっちり決めなければならないということです。言語を超えてしまえば、超えたあとは各言語の Rx で処理してやれば問題ないはずなので、そのあたりの仕様をきっちり決め、言語を超えます。
.NET のイベントは使うか未定です。というか C++ や Java で Rx-interface で扱うのにこれを .NET-event に書き換える必要があるか、検討すべきでしょう (ただし Rx.NET に依存しないことは一つ利点があるかもしれません)。
4. 画像レイヤー
libjpeg (JPEG), libpng (PNG), libwebp (WebP), jxrlib (JPEG-XR), libmng (MNG), giflib (GIF) ぐらいかなーって…
WIC/Direct2D Effect とか CoreImage に投げたいですね、ええ。このあたりのプラットフォームに依存することで、配布時のバイナリーサイズ減らせるメリットぐらいはあるんじゃないんですかね。どちらにせよ優先度はかなり低い。Typography より大事だと、私は考えていないので。
MNG や GIF はアニメーション対応するか微妙かも。まあ xaml 系統は対応しないのが通例なんですが、DispatcherTimer 使えばさほど大変じゃない気がするし実装するのもアリかもね。
あと WebP や JPEG-XR を採用するのは画質とか圧縮性とかで優れているし、モバイルプラットフォームではこういうのが標準で入ってることで強みになるんじゃないかな、って。とりあえず有名どころ 2 件あげた次第であります。
5. 動画レイヤー
いろいろと辛いんじゃないかな… こちらはプロジェクトが成熟していってもたぶんしばらく実装がないです。てかこれが一番やばいです。
というか作者は逃げたいです、これからは。Windows だと Media Foundation、OS X/iOS だと CoreVideo です。Linux は知りません。
逃げたいです^q^
6. 音声レイヤー
SE とか xaml で流したりできると思うのですが、これはまあたぶん Xxaml ではやりません。これは流石に xaml の責務を超えていると思うので。一方↑の動画レイヤーって xaml に簡単に組み込めるのが大事、だと思うので、実際↑は必要だけど、こっちは必要ないってところかな…
7. まとめ
各レイヤーの設計についてまとめてみました。テキスト周りは最優先事項で一番慎重に扱いたいなーって思っている部分です。むしろ今の時代ここが大事で、ここを以下にせめるか、が大事なので、製品としてある程度使えるレベルになってる頃は DirectWrite/CoreText で動作するようにしたいと考えています。
また、xaml の縦書き、みたいなのもやりたいですね… L2R R2L だけでなく T2B。やりたい、是非。DirectWrite には縦書き API あるの知ってますが、CoreText にはあるのかな? このあたり要調査だし、そもそも僕 Mac 持ってないんで誰かください。MBA w/Retina の一番たかいやつでー。(ぉぃ
はい、ということで、なんか MS のやつのタイムライン見てたら、頭でこういうことが思考されていて寝れなくなったのでブログ記事書いた次第です。寝てる間も脳は考えてるからなぁ…
以上です。