2011-03-27 81 views

回答

13

iPhone GPU是基於圖塊的渲染器。如果覆蓋圖層在整個圖塊上完全不透明,那麼除了不必對該圖塊中的像素進行合成之外,GPU可以忽略設置和處理與該圖塊下面的圖層相關的任何圖形命令。

如果您的圖片沒有覆蓋完整的圖塊,GPU仍然必須處理多個圖層。瓦片的大小取決於實施情況,但微小的圖形圖像不太可能覆蓋瓦片。覆蓋多個瓷磚的巨大圖像將顯示從不透明的最大優勢。

3

當視圖或圖層不透明時,您會獲得比不透明時更好的性能。如果它不透明,圖形系統必須將該圖層與下面的圖層進行合成以生成最終圖像。如果它是不透明的,那麼它只是將像素複製到幀緩衝區。

9

View Programming Guide for iOS

聲明視圖作爲不透明每當 可能

UIKit中使用不透明 屬性的每一視圖的確定 視圖是否可以優化 合成操作。將此屬性的 值設置爲YES, 自定義視圖會告訴UIKit,它確實不需要爲您的視圖呈現 後面的任何內容。較少的渲染可能會導致 代碼的性能提高 ,並且通常會受到鼓勵。 當然,如果將不透明屬性 設置爲YES,那麼您的視圖必須完全填充其邊界矩形,並使用完全不透明的內容填充 。

hotpaw2指出了背後的幕後原因,可在OpenGL ES Programming Guide for iOS發現:

推遲 呈現的另一個優點是,它允許GPU來 執行隱面在處理 片段之前刪除。 不可見的像素會被丟棄,而不會被 抽樣紋理或執行 碎片處理,顯着減少GPU 必須執行的計算以呈現圖塊。爲了 理解本 功能最大的好處,用不透明的內容能夠吸引儘可能多的幀 的可能和 儘量少用勾兌的,阿爾法 測試,並在GLSL着色器的丟棄指示 。由於硬件 執行隱藏表面刪除,因此您的應用程序不需要 ,從012到從前到後排序原語。

0

有一點棘手的問題需要注意的是,UIImageView將在任何時候將圖像屬性更改爲新的UIImage時將opaque屬性重置爲FALSE。您可以明確地檢查代碼並在對image屬性進行任何更改後設置opaque屬性,或者可以擴展UIImageView併爲您提供自己的setImage實現,它在調用super setImage方法後設置爲不透明。我只是偶然發現了這件事。

+0

有意思......那麼你如何處理表現並將不透明設置爲YES?在更改圖像後立即重新設置? – 2014-10-14 22:44:17

+0

是的,它必須在圖像屬性更改後重置。性能獲勝發生在OS運行的視圖組合邏輯內部。如果沒有設置財產,那麼設置財產對性能問題的影響並不大,而在構圖過程中需要額外的工作。 – MoDJ 2014-10-16 06:04:48

相關問題