2012-05-20 35 views
3

我們可以創建從當前圖形上下文層,然後得到層的上下文:在iOS上,我們從上下文創建一個圖層並獲取圖層的上下文之後,這些上下文如何相互關聯?

CGContextRef context = UIGraphicsGetCurrentContext(); 

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

CGContextRef contextOfLayer = CGLayerGetContext(layer); 

所以我們現在有2個上下文:contextcontextOfLayer。這兩種情況如何相互關聯? contextOfLayer實際上是context的一部分,而context有一個圖層上下文指針的數組?如果我用NSLog(@"%p", ...)打印出他們的地址,他們有不同的地址,所以他們不是同一個對象。而且我認爲contextOfLayer不會影響上下文堆棧,那它只是一種獨立的上下文而已?

回答

3

如果您瞭解CGLayer的基本原理,這會有所幫助。 CGLayer意味着當您重複繪製相同的內容到特定類型的上下文時的優化。

(例如:位圖上下文與特定的格式 - 或PDF環境等 - 如32位RGBA)

當您創建CGLayer,你通過它,你打算動用上下文進入CGLayer。這可以讓CGLayer爲這種情況進行優化。

之後,如果您將CGLayer繪製到該上下文中,或繪製到具有相同格式的不同上下文中,繪圖將更快。

如果您將CGLayer繪製到具有不同格式的上下文中,繪圖仍然可以工作,並且不會出現錯誤。但是,如果你直接從這個角度來看,它可能不會比以前更快。

documentation for CGLayerCreateWithContext說:

方面

你想創建一個相對於層的圖形上下文。 圖層使用此圖形上下文作爲 初始化的參考。

這意味着該層將給定的context看作是參考。這並不一定意味着context存儲在CGLayer或永久引用。它可能是,但你不能說 - 這是一個內部實現細節。

documentation for CGLayerGetContext

所返回的上下文是該層本身,而不是您在創建圖層指定的上下文背景。

所以你應該期望context != contextOfLayer

此外,API並未指定有關這些上下文如何相互關聯的任何內容 - 它們可能在內部引用對方,或者它們可能不引用。作爲API的用戶,我們不應該假設任何東西。

具體回答你的問題:

是contextOfLayer實際語境和上下文的部分有一層上下文指針的數組?

我們不知道,我們無法找到答案。作爲API的用戶,我們不應該編寫任何假設這種或那種方式的代碼。

我想contextOfLayer不會影響上下文堆棧,所以它只是一個獨立的上下文而已嗎?

是的,它是一個獨立的上下文。 UIKit中的「上下文堆棧」是更高層次的概念。 CoreGraphics中的CGLayer是一個較低級別的API,它不知道UIKit的任何內容。

+0

aha,謝謝......我想知道內部結構不取決於它是如何實現的,但僅僅是爲了理解它如何在內部工作 –

+0

CoreGraphics不是開源的,所以沒有辦法知道。 (除非你想拆解圖書館,這將是一項重要的工作。) –