圖片展示到屏幕的流程
讓我們來看下一張圖片展示的全過程:
1)讀入UIImage
在代碼中澡谭,我們讀取圖片一般需要一個path,無論是本地圖片還是遠程圖片呐萌,我們獲取到的實際上是一個二進制數(shù)據(jù)串崭倘,用UIImage來表示祥楣。
- 用UIImage為UIImageView賦值
3)系統(tǒng)偵測數(shù)據(jù)變化
一個系統(tǒng)提供的隱式事務(wù)CATransaction捕獲了UIImageView圖層樹的變化。在下一個runloop到來時培廓,Core Animation提交了這個CATransaction惹悄,開始準備渲染所需的位圖BitMap數(shù)據(jù)。
4)解壓縮UIImage數(shù)據(jù)到位圖BitMap
位圖實際上是個像素數(shù)組肩钠,對應(yīng)著圖片上的每一個點泣港。如果提供bmp文件,確實不需要解壓縮价匠,但是平常使用最為廣泛的png或jpg圖片都是壓縮后的位圖当纱。需要對齊進行解壓縮。
- GPU進行坐標變換
一張1000*1000的BitMap踩窖,我們可以對其變形渲染到任意尺寸的UIImageView上坡氯,GPU需要對坐標進行轉(zhuǎn)換,計算出實際的屏幕坐標毙石。
6)頂點著色器
它把一個單獨的頂點作為輸入廉沮。頂點著色器主要的目的是把3D坐標轉(zhuǎn)為另一種3D坐標(后面會解釋),同時頂點著色器允許我們對頂點屬性進行一些基本處理徐矩。
7)圖元裝配階段
將頂點著色器輸出的所有頂點作為輸入(如果是GL_POINTS滞时,那么就是一個頂點),并所有的點裝配成指定圖元的形狀滤灯;
8)幾何著色器
圖元裝配階段的輸出會傳遞給幾何著色器(Geometry Shader)坪稽。幾何著色器把圖元形式的一系列頂點的集合作為輸入,它可以通過產(chǎn)生新頂點構(gòu)造出新的(或是其它的)圖元來生成其他形狀鳞骤。
9)光柵化階段
幾何著色器的輸出會被傳入光柵化階段(Rasterization Stage)窒百,這里它會把圖元映射為最終屏幕上相應(yīng)的像素,生成供片段著色器(Fragment Shader)使用的片段(Fragment)豫尽。在片段著色器運行之前會執(zhí)行裁切(Clipping)篙梢。裁切會丟棄超出你的視圖以外的所有像素,用來提升執(zhí)行效率美旧。
10)片段著色器
片段著色器的主要目的是計算一個像素的最終顏色渤滞,這也是所有OpenGL高級效果產(chǎn)生的地方贬墩。通常,片段著色器包含3D場景的數(shù)據(jù)(比如光照妄呕、陰影陶舞、光的顏色等等),這些數(shù)據(jù)可以被用來計算最終像素的顏色绪励。
11)測試與混合
在所有對應(yīng)顏色值確定以后肿孵,最終的對象將會被傳到最后一個階段,我們叫做Alpha測試和混合(Blending)階段疏魏。這個階段檢測片段的對應(yīng)的深度(和模板(Stencil))值(后面會講)停做,用它們來判斷這個像素是其它物體的前面還是后面,決定是否應(yīng)該丟棄蠢护。這個階段也會檢查alpha值(alpha值定義了一個物體的透明度)并對物體進行混合(Blend)雅宾。所以,即使在片段著色器中計算出來了一個像素輸出的顏色葵硕,在渲染多個三角形的時候最后的像素顏色也可能完全不同眉抬。