なぜviewが設定されているOpaqueのパフォーマンスが向上するのか(GPU)


変換元:http://blog.csdn.net/u011452278/article/details/51555806
Opaqueこの属性はBOOL値であり,UIViewのデフォルト値はYESであるが,UIButtonなどのサブクラスのデフォルト値はいずれもNOである.opaqueは現在のUIViewが不透明かどうかを示していますが、面白いのは事実です.
現在のUIDIewが不透明かどうかを決めることはできません.例えば、opaqueをNOに設定すると、そのUIDIewは同じように見えます(前述したように、alphaやhiddenの属性によって決まるかどうか)、道理でNOは透明を表しますが、それは見えないのではないでしょうか.
ディスプレイ内の各ピクセルポイントは、上の図に赤と緑の2つのレイヤーカラーブロックがあるなど、RGBA色空間からなる色値を表示することができます.交差していない部分、すなわち純赤と緑の部分では、対応する位置のピクセルポイントは、赤または緑を簡単に表示する必要があります.対応するRGBAは(1,0,0,1)と(0,1,0,1)でいいです.グラフィック表示を担当するGPUは、画素点に対応する表示内容を決定するために計算量が少ない.
問題は赤と緑が交差している部分で、交差する色は黄色です.ここの黄色はどうやって来ましたか?
元々、GPUはレイヤー1とレイヤー2の色でレイヤーを混合し、混合部分の色を計算していたが、最も理想的な計算式は以下の通りである.
R = S + D * ( 1 – Sa )
ここで、Rは混合結果の色を表し、Sはソース色(上位に位置する赤色レイヤー1)、Dはターゲット色(下位に位置する緑色レイヤー2)、Saはソース色のalpha値、すなわち透明度である.式中のすべてのSおよびD色は、透明度が予め乗じられていると仮定する.
レイヤーブレンドの基本原理を知ってから、本題に戻ってopaque属性の役割を話します.UIViewのopaque属性がYESに設定されると、上の式、つまりSaの値が1となり、このとき式は次のようになります.
R = S
つまりDが何であれ、結果は同じである.従ってGPUは計算合成を一切行わず,その下の何も考慮する必要はなく(それが遮られているため)、この層から簡単にコピーする.これはGPUのかなりの作業量を節約した.このように、opaqueプロパティの実際の用途は、グラフィックスシステムにパフォーマンス最適化スイッチを提供することです.
前述の論理によれば、opaque属性がYESに設定されている場合、GPUはレイヤ色合成式を利用して真の色値を合成しない.そのため、
opaqueがYESに設定されており、UIViewに対応するalpha属性が1.0でない場合、予期せぬ事態が発生する
この点、アップルは公式文書で明確な説明をしています.
An opaque view is expected to fill its bounds with entirely opaque content—that is, the content should have an alpha value of  1.0
. If the view is opaque and either does not fill its bounds or contains wholly or partially transparent content,the results are unpredictable. You should always set the value of this property to  NO
 if the view is fully or partially transparent.