隨着短視頻、美顏相機等APP愈來愈火,對於一個移動端開發工程師來講,跟上時代的潮流即是咱們必備的意識。ios
固然還有一點,接觸移動開發,咱們不只僅是要了解若是使用API去將控件擺在屏幕上,咱們還應該去了解,圖片是如何去渲染到屏幕上面的,這裏面到底有哪些過程,經過了解這些過程以後,在後面的開發這種咱們能怎麼去優化項目呢?這裏面的門道,每每是一些初中級程序員忽略的部分。程序員
那麼這一系列的文章,就是從OpenGL開始,手把手的帶你們感覺圖形渲染的魅力。在我本身的學習過程當中,也將本身的學習過程,以及學習成果分享給你們。但願能幫助到你們,若是有不認同的地方,歡迎能在留言中指出來,固然也能夠將問題發送到個人郵箱:coderspr1nghall@gmail.com
。咱們一塊兒討論,一塊兒飛。 這篇文章主要是將一些經常使用的專業術語進行總結,方便本身往後的查閱。算法
[TOC]編程
OpenGL (Open Graphics library) 是⼀一個跨編程語⾔、跨平臺的編程圖形程序接⼝,它將計算機的資源抽象稱爲一個個OpenGL的對象,對這些資源的操做抽象爲一個個的OpenGL指令。數組
OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL 三維圖形 API 的子集,針對⼿機、 PDA和遊戲主機等嵌入式設備而設計,去除了許多沒必要要和性能較低的API接口。緩存
DirectX 是由不少API組成的,DirectX並非一個單純的圖形API. 最重要的是DirectX是屬於 Windows上一個多媒體處理API.並不支持Windows之外的平臺,因此不是跨平臺框架. 按照性 質分類,能夠分爲四大部分,顯示部分、聲音部分、輸⼊部分和網絡部分。網絡
Metal 是Apple爲遊戲開發者推出了新的平臺技術 Metal,該技術可以爲 3D 圖 像提升 10 倍的渲染性能。Metal 是Apple爲了解決3D渲染⽽而推出的框架。架構
其實蘋果自14年推出Metal以後,就已經很明確的告訴你們,在極限性能方面,Metal的表現是要更加的出色的。由於他們對Metal作了不少針對性的優化,讓他在iOS的設備上能有一個更完美的發揮。 這裏也能夠看出,Metal是能夠取代OpenGL ES的。可是如今市場上面,依然仍是OpenGL ES的使用率更高。因此OpenGL ES和Metal的關係就有點像是Objective-C和Swift的關係同樣。框架
狀態機理論上是一種機器,其實咱們能夠這樣去理解,狀態機描述了一個對象在其生命週期中所經歷的各類狀態,狀態之間的轉變,發生轉變的動因,條件以及轉變中所執行的活動。這一點上來講,跟JSContext也能夠類比一下。咱們的任何行爲都是依賴着狀態機的,狀態機會記錄全部的行爲,那麼咱們在須要使用某一個行爲的時候,也是能夠經過狀態機去拿出來某一個行爲。因此狀態機也是一種行爲,說明對象在其生命週期中相應事件所經歷的狀態序列以及對那些狀態事件的相應。函數
所以具備如下特色:
這個好理解,就是將圖形/圖像數據轉換成3D空間圖像操做叫作渲染。例如,在圖片或者視頻進行解碼以後,造成了一大堆的二進制文件,而後咱們將這一堆的二進制文件顯示到屏幕上面的過程就能夠理解爲渲染。
那麼什麼是頂點呢?頂點就是指咱們再繪製一個圖形的時候,他的頂點的位置數據,這個數據是能夠直接存儲在數組中或者將其緩存在GPU內存中的。若是存儲在數組中就構成了頂點數組。其實頂點數據就是咱們在畫畫的時候,最開始畫的一個大體的骨架。在OpenGL中的圖像都是由圖元組成。在OpenGL ES中,有三種圖元:點、線、三角形。咱們經過設定函數的指針,將頂點數據存儲在內存中,而後須要繪製的時候,直接從內存中取出來使用。這一部分的數據其實就是頂點數組。
咱們上面說了,咱們在調用繪製方法的時候,直接就由內存傳入頂點數據。還有一種更加高性能的方法,就是提早分配一快內存,將頂點數據預先傳入到顯存當中,這部分的顯存,就叫作頂點緩衝區。值得注意的是,這一塊空間再也不內存中,而是在顯存的一塊空間中。
由於咱們的GPU在處理數據的時候,是經過一個固定的順序來的,這個順序不能被打破。相似一個流水線的形式,因此被稱之爲管線。
紋理能夠理解爲一個圖片,也就是位圖。⼤家在渲染圖形時須要在其編碼填充圖⽚,爲了使得場景更加逼真.⽽這里使⽤的圖片,就是常說的紋理.可是在OpenGL,咱們更加習慣叫紋理,⽽不是圖片。
在測試階段以後,若是像素依然沒有被剔除,那麼像素的顏色將會和幀緩衝區中顏色附着上的顏色進行混合,混合的算法能夠經過OpenGL的函數進行指定。可是OpenGL提供的混合算法是有限的,若是須要更加複雜的混合 算法,⼀般能夠經過像素着⾊器進行實現,固然性能會比原生的混合算法差一些。
例如圖形想發平生移,縮放,旋轉變換。就須要使用變換矩陣。
⽤於將3D座標轉換爲二維屏幕座標,實際線條也將在二維座標下進行繪製。
當咱們想把一個圖像渲染到窗口的時候,GPU會開闢一個渲染緩衝區。可是每個窗口又只有一個緩衝區,那麼若是在繪製的過程當中屏幕進行了刷新,窗口顯示的畫面就有可能不完整。爲了解決這個問題,常規的OpenGL程序至少都會有兩個緩衝區。顯示在屏幕上的稱爲屏幕緩衝區,沒有顯示的稱爲離屏緩衝區,在一個緩衝區渲染完成以後,經過將屏幕緩衝區和離屏緩衝區交換,實現圖像在屏幕上的顯示。在iOS中常常遇到的離屏渲染,其實就是雙緩衝區的機制引發的。若是這方面有疑問的,能夠移步iOS 保持界面流暢的技巧去了解。 使用了雙緩衝區和垂直同步技術以後,因爲老是要等待緩衝區交換以後再進行下一幀的渲染,使得幀率沒法徹底達到硬件容許的最高水平。爲了解決這個問題,引入了三緩衝區技術,在等待垂直同步時,來回交替渲染兩個離屏的緩衝區,而垂直同步發生時,屏幕緩衝區和最近渲染完成的離屏緩衝區交換,實現充分利用硬件性能的目的。