2010-01-27 79 views
5

如果我寫在Mac OS X或iPhone OS核心圖形繪製代碼,我可以通過調用活動的填充顏色設置爲紅色:混合色彩空間有沒有懲罰? (核芯顯卡)

CGContextSetRGBFillColor(context, 1.0, 0.0, 0.0, 1.0); // RGB(1,0,0) 

如果我想50%的灰色,我可以電話:

CGContextSetRGBFillColor(context, 0.5, 0.5, 0.5, 1.0); // RGB(0.5,0.5,0.5) 

但對於灰這是很有誘惑力的色調,使較短的線路和呼叫:

CGContextSetGrayFillColor(context, 0.5, 1.0); 

Howev呃,這個功能不是簡單地調用RGB方法,強度值被複制三次;而是將上下文的顏色空間從DeviceRGB更改爲DeviceGray。下一次調用RGB方法將切換回來。

我很好奇,想知道:

  • 有什麼處罰切換色彩空間?
  • 當你的上下文的顏色空間與你的設備的本地色彩空間不匹配時,是否會有一個懲罰? (即在DeviceGray與DeviceRGB中繪圖)

我在問技術好奇心,而不是過早優化的願望,所以請保持警惕到最低限度。

+1

不知道它是否更快,但不能通過構建一個測試它的測試項目來測試它嗎?一次運行將通過始終使用相同的色彩空間來測試填充,另一次將在色彩空間之間切換。我猜測如果存在懲罰,它會將顏色值從顏色空間轉換爲位圖的顏色空間,但測試之間的差異可以忽略不計。 – lucius 2010-02-10 06:36:21

+0

是的,在這一點上,我計劃在有空的時候寫一些測試代碼。我正在等待首先獲得Tumbleweed徽章,但看起來我的問題並不令人感興趣。 – benzado 2010-02-10 19:49:31

回答

1

我一直在以類似的方式廣泛使用,並已注意到性能方​​面沒有任何處罰。

+0

我想像任何性能差異低於「注意」的閾值。 – benzado 2010-03-12 06:57:03

+0

是的。但是,如果您認爲可能會有性能損失,那麼正確的方法是運行基準測試。根據經驗,我可以告訴你,只有直接在屏幕上繪製(或影響繪圖)的方法/屬性可能會有罰分,例如adjustsFontSizeToFitWidth。這可能並不總是顯而易見的。 – 2010-03-15 19:17:40

3

從概念上講,有一個懲罰,但在實踐中它是如此微不足道,以至於無關緊要;即使在具有自定義色彩空間的情況下,將(例如)灰色陰影轉換爲RGB三元組(加alpha)也是微不足道的算術。

色彩空間確實在繪製圖像時會有損失,因爲它不僅僅是單個轉換操作的問題。每個像素都必須進行轉換,儘管可以在這裏完成優化(例如,CLUT,顏色查找表,如果源圖像使用索引顏色很有用),但它們在您也發現石英代碼。

你說你期望CGContextSetGrayFillColor()改變圖形上下文的顏色空間,但事實並非如此。這樣做將需要轉換該圖形上下文的內容以匹配上下文的新顏色空間。因爲轉換顏色而不是上下文的緩衝區會更便宜和簡單(例如,通過在之下提供CGContextSetRGBFillColor()的底層封裝),在任何明智的實現中都會避免這樣的開支。

+0

該文檔[明確指出](http://developer.apple.com/iphone/library/documentation/GraphicsImaging/Reference/CGContext/Reference/reference.html#//apple_ref/c/func/CGContextSetRGBFillColor)表示'CGContextSet Color()函數改變上下文的顏色空間。不過,我認爲這與改變你所繪製的緩衝區的顏色空間不一樣。 – benzado 2010-07-09 15:16:48

+1

不,它表示他們設置了* fill *或* stroke *色彩空間 - 您傳遞的「CGFloat」值形成一個色彩座標的色彩空間。這就意味着,當你提供R,G,B,A或你傳遞的任何值時,它們就會被正確解釋。 上下文的顏色空間(如果它可以被認爲具有一個顏色空間)始終與目標的顏色空間匹配;有兩個不匹配將是無意義的。 :) 查看'CGContextSetStrokeColorSpace()'和'CGContextSetFillColorSpace()'的文檔 - 這些funcs最終都會圍繞其中一個'CGContextSetFillColor()'進行包裝。 – 2010-07-09 15:26:12

+1

(或者在'CGContextSetStrokeColor()'周圍),不在空間中。) – 2010-07-09 15:31:52