3

現在のグラフィックス コンテキストからレイヤーを作成し、レイヤーのコンテキストを取得できます。

CGContextRef context = UIGraphicsGetCurrentContext();

CGLayerRef layer = CGLayerCreateWithContext(context, 
                                            CGSizeMake(self.frame.size.width,
                                                self.frame.size.height), NULL);

CGContextRef contextOfLayer = CGLayerGetContext(layer);

これで、 と の 2 つのコンテキストができcontextましcontextOfLayerた。これらの 2 つのコンテキストは互いにどのように関連していますか? contextOfLayer実際にはレイヤー コンテキスト ポインターの一部であり、その配列を持っていますかcontext? contextを使用してアドレスを印刷すると、アドレスNSLog(@"%p", ...)が異なるため、同じオブジェクトではありません。コンテキストスタックには影響しないと思いますcontextOfLayerが、それは単に独立したコンテキストであり、それ自体が「そこに存在する」ようなものですか?

4

1 に答える 1

3

の根拠を理解していただけると助かりますCGLayerCGLayer同じコンテンツを特定の種類のコンテキストに繰り返し描画する場合の最適化を目的としています。

(例: 特定の形式のビットマップ コンテキスト (例: 32 ビット RGBA) または PDF コンテキストなど)

を作成するときはCGLayer、 を描画するコンテキストを渡しますCGLayer。これにより、CGLayerはそのようなコンテキストに合わせて最適化されます。

後で、CGLayerそのコンテキスト、または同じ形式の別のコンテキストに を描画すると、描画が高速になります。

異なる形式のコンテキストに を描画しCGLayerても、描画は機能し、エラーは発生しません。ただし、そのコンテキストに直接描画した場合よりも高速ではない可能性があります。

CGLayerCreateWithContextのドキュメントには次のように書かれています。

環境

レイヤーを作成するグラフィックス コンテキスト。レイヤーは、このグラフィックス コンテキストを初期化の参照として使用します。

これは、レイヤーが指定contextされた を参照として参照することを意味します。contextが 内に格納されているCGLayer、または永続的に参照されているとは限りません。そうかもしれませんが、わかりません。これは内部実装の詳細です。

CGLayerGetContextのドキュメントには、

返されるコンテキストは、レイヤーの作成時に指定したコンテキストではなく、レイヤー自体のコンテキストです。

したがって、それを期待する必要がありcontext != contextOfLayerます。

繰り返しますが、API はこれらのコンテキストが相互にどのように関係するかについて何も指定していません。内部で相互に参照している場合もあれば、そうでない場合もあります。API のユーザーとして、何も想定しないでください。

質問に具体的に答えるには:

contextOfLayer は実際にはコンテキストの一部であり、コンテキストにはレイヤー コンテキスト ポインタの配列がありますか?

私たちは知りませんし、調べることもできません。API のユーザーとして、何らかの方法で仮定するコードを書くべきではありません。

contextOfLayer はコンテキストスタックに影響を与えないと思うので、それ自体が「そこに存在する」だけの独立したコンテキストですか?

はい、それは独立したコンテキストです。UIKit の「コンテキスト スタック」は、より高いレベルの概念です。CGLayerCoreGraphics の は、 について何も知らない低レベルの API ですUIKit

于 2012-05-20T18:14:07.457 に答える