ひ to り go と

UIKit for Mac はいつ?

MacDev

Retina ディスプレイが登場していろいろメリットはあるけど、そのうち重要な一つが、サブピクセルレンダリングなしでも文字が読みやすくなることだと思う。

“試用可能な場合は LCD で滑らかな文字を使用”というチェックボックスがシステム環境設定にあるけど、これがサブピクセルレンダリングに関する設定。

↑サブピクセルレンダリングによる違いとその説明を兼ねた図。通常のアンチエイリアス(上)では線の太さをグレーで表現していて、細く小さい文字だとピクセルが足りず擦れたようになってしまう部分があるけど、サブピクセルレンダリング(下)ではテキストカラーとは異なる色が少し混じっていて上記の原理でこの問題を解決している。

サブピクセルレンダリングには一つの大きな制約がある。それは、背景の色に依存していて必ず背景の上に描画しないといけないことだ。

AppKit の古くからの方式では 1 つのウインドウにつき 1 枚のグラフィックスコンテキストがあり、再描画する必要のある領域を親ビューから子ビューへと順番に描画して書き換えていく方式なのでサブピクセルレンダリングとは相性がいい。

iPhone では登場当時からサブピクセルレンダリングがないけど、基本的に Mac より文字のサイズ(ピクセル数)が大きくボールドが多用されていたこともありほとんど読みにくいことはなかった。iPhone 4 以降では Retina ディスプレイが採用され、通常のアンチエイリアスでも細い線までインクのように美しい。

iOS の UIKit は Core Animation の CALayer ベースでそれぞれのビューが独立したグラフィックスコンテキストを持ち、それらにあらかじめ描画しておいたものを GPU が移動や変形をするため滑らかなアニメーションが実現できるのだけど、これに加えてサブピクセルレンダリングを使用しようとすると

  • LCD 1 ドットの中で RGB の並ぶ方向に依存するため、ビューを描画する時点で画面に対する向きを知っている必要がある。もし画面が回転するようなことがあればすべての文字を再描画しなければならない。
  • 1 つのコンテキスト内で背景と文字を描画する必要があるため UILabel のようなビューではその背後のビューと同じ色の背景色を設定しなければいけなかったりして手間がかかる。
  • UILabel の背景にあるビューがグラデーションだったらどうする?

といったように、CALayer のメリットを打ち消してしまう。

なので UIKit のような CALayer ベースの UI Kit を Mac にも欲しいという声がときどきあるけど、そのメリットを最大限に活かすにはサブピクセルレンダリングを捨てなければならず、登場は Mac 全体に Retina ディスプレイが浸透してからではないかなと思う。

2012.6.17 追記

でも AppKit は NeXT 時代から続く歴史の長いフレームワークであるとはいえ、互換性を重視しすぎる他社のものと比べると数多くの脱皮を繰り返し、しっかりと時代に合った進化をしてきた部分も多い。

OS バージョンアップのたび徐々に CALayer のサポートが強化されたり、Lion でまったく新しい自動レイアウト機能が NSView に導入されたりするのを見ると、Apple もまだ本気で AppKit に力を入れているような感じもする。

Mac と AppKit はまだまだ長い付き合いかもしれない。

Share

(参考になったらぜひ。記事を書くモチベーションの向上に役立てます。)