2013-12-18 62 views
4

我正在繪製UIView的drawRect中的CGBitmapContext塊。什麼是最好的CGBitmapInfo枚舉值來確保性能最佳?現在,我使用kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big,但我也看到了這個計算器問題片斷這表明一種替代方案:iOS上的CGBitmapInfo值性能

Why does this code decompress a UIImage so much better than the naive approach?

// makes system don't need to do extra conversion when displayed. 
kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little 

我CGBitmapContext是可變的,因此用戶可以充分利用它,將圖像添加到它等。

+0

就我所知第二組選項如果更快。但是,你可以使用UIGraphicsBeginImageContextWithOptions來創建位圖上下文,不用擔心這些細節嗎? – yurish

+0

我的CGBitmapContext是可變的,這意味着用戶可以在它上面繪圖,添加圖像等等,然後所有這些都需要使用UIView drawRect顯示在屏幕上。 – jjxtra

+0

@yurish你能指點我關於爲什麼第二個更快的文檔嗎? – jjxtra

回答

3

我用kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32BigkCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little進行了測試,分析器確實告訴我有一個稍微不同的代碼路徑。

kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little直接複製內存,而kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big經歷轉換功能。

這使得在我的CGBitmapContext(即使在iPod 4上)中繪製路徑的總時間幾乎沒有影響,然後致電setNeedsDisplayInRect:將它們顯示在屏幕上。此外,由於整體時間基本相同,我堅持使用kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big

編輯 我爲了有因爲有對性能沒有影響使用BGRA(小端)字節順序其他iOS框架(如AVFoundation)更好的兼容性轉回kCGBitmapByteOrder32Little

+0

你測量的總時間包括時間將位圖從一種格式轉換爲另一種格式嗎? – yurish

+0

是的,總體毫秒非常接近(可能是10-20的差異)。也許我會再次介紹它併發布確切的時間。 – jjxtra

+0

你怎麼能測量轉換時間?如果我理解正確,則此轉換在Core Animation事務提交時完成。 setNeedsDisplayInRect:只是標記重繪的視圖,繪圖本身稍後在運行循環中發生。 – yurish