2011-08-13 16 views
9

まず、このトピックが数回前に持ち出されたことを知っていますが、過去に使用した「解決策」のどれもがこの特定の場合。私はCALayerにテキストを描画していますが、これは自分のNSToolbar内のビューでホストされています。ここでは、テキストの外観が好きなものです:Core Animationでテキストがレンダリングされない

Font smoothing on

私はコンテキストに描画する前にサブピクセルアンチエイリアスをオフにするCGContextSetShouldSmoothFonts(ctx, false)を呼び出すことですthis StackOverflowのポストからの提案を使用してみました。これは、過去に私に許容可能な結果を​​与えたソリューションですが、この場合には、テキストがさらに悪化見えてきたようだ:

Font smoothing off

その記事で言及された他の解決策は、矩形を埋めるためにあります描画の前に不透明な背景色を使用します。これは、ツールバーの背景がグラデーションであるため、この場合は不可能です。このテキストを普通のテキストのように見えるようにするためにできることはありますかNSView

+1

私は、スクリーンピクセルとのレイヤーのアラインメントが分からないため、CAがサブピクセルアンチエイリアスなしでレンダリングすると考えています。しかし、多くの場合、レイヤーは正確に整列されているため、サブピクセルのアンチエイリアシングは適切です。私はまだこれに具体的な解決策を見いだすことはありません - 私たちが偉大な答えを得ることを期待して+1: – jtbandes

+0

また、あなたが投稿した最初のスクリーンショットに何が間違っていますか?あなたの望む結果は何ですか? – jtbandes

+0

言葉で説明するのは難しいですが、テキストはややシャープに見えます。ほとんどギザギザに見えます。その1つの小さなスクリーンショットから見るのは難しいですが、一度全体の画像をアプリケーションの残りの部分と比較するとかなり明らかです – indragie

答えて

5

残念ながら、魔法の修正はありません。 SPAAを取得するには、終わりにテキストに不透明な背景に描画する必要があります。それはうんざりですが、レイヤーがどのように機能するかを考えると、多くの意味があります。そして、正直言って、私はAppleがこれを "修正"することはこれまでできなかった。私はこれが、古いソフトウェア合成モデルに長年取り組んできた理由だと思う。難しい問題です。彼らは高いDPIに行くことでそれを無視したいと考えています。

しかし、とにかく、特定のケースでSPAAを取得する方法はいくつかあります。

テキストを描画するときに、グラデーションを再作成して描画することができます。しかし、明らかに、ツールバーのグラデーションがOSアップデートで変更され、グラデーションが正確に一致するようにするのは難しいかもしれません。

または、実際にはツールバーの背景の画像を実行時または事前に取得して、背景として描画することができます。

+0

最後の提案は、それが良いものかもしれないようです。私はそれを試して、それがどのように機能するかを伝えます。 – indragie

+0

私はグラデーションを作り直した後、それを描くだけで完璧に動作します。あなたが言ったように、それは将来のOSリビジョンで変更されるかもしれませんが、私はそのイベントの準備に時間をとると思います。私は実際にこの方法で動作させることができたので、この答えを正しいとマークしていますが、Robの答えは素晴らしい技術的な説明も提供します。 – indragie

7

サブピクセルアンチエイリアスが不可能な理由は、背景の裏にあるのは、CALayersが本質的に単なるOpenGLテクスチャです。

これは、それらがGPUによって直接処理され、レンダリングされるビットマップであることを意味します。 GPUはテキストについて何も知らないので、サブピクセルアンチエイリアスを適用することはできません。

サブピクセルアンチエイリアスを処理するには、レイヤが変更されるたびにレイヤコンテンツのピクセル値を再計算する必要があります。これは非常に高価になり、GPUでレイヤをホストする全体的なポイントを削除します。これは非常に高速な合成とレンダリングを行うことです。

不透明な背景のテキストでSPAAを使用できる理由は、レイヤテクスチャがGPUに保存される前にテキストがサブピクセルアンチエイリアスでプリレンダリングされるためです。テキストの背景が透明であれば、これはできません。

あなたはこの制限を守らなければなりません。ありがたいことに、最終的にHiDPIディスプレイを取得すると、もはや問題にはなりません...サブピクセルアンチエイリアスをまったくしないiPhoneを見てください。 iPhoneでは、高画質の解像度のため、文字はきれいに見えます。

+0

しかし、どの点で(例えば、 'CATextLayer'からの)テキストがレンダリングされていますか?サブピクセルのアンチエイリアスでレンダリングさせる簡単な方法はありませんか?スクリーンピクセルに常に整列されることがわかっているかぎりです。 – jtbandes

+0

テキストは変更されるたびにレンダリングされ、本質的にバッキングOpenGLテクスチャのビットマップとして書き込まれます。 SPAAを計算することが可能な場合にはどうにかしてこの問題が解決できるとは思いますが、残念ながらそうではありません。あなたがそれを変更したい場合は、バグレポートを提出してください... –

+0

しかし、それは可能です。ソリッドバックグラウンドのテキストフィールド(ラベル)がある場合、その親ビューがレイヤーバックであっても、SPAAを使用しているようです。何が起こるのでしょうか? – jtbandes

0

私は、OpenGL、アニメーション、リアルタイムスクロールテキスト、マルチサンプルAAを使用してテクスチャ上のテキストをレンダリングした経験があります。アルファで4バイトのテクスチャは、背景が気にならず透明ではない。 OpenGLはその透明テクスチャをリアルタイムでレンダリングします。グリフの小さな変化でテクスチャを作り直すことは、マイクロ秒の問題です。 Appleはそれを修正することができた。

関連する問題