OpenGL(Open Graphics Library):圖形硬件的軟件接口马胧,將計(jì)算機(jī)的資源抽象成一個(gè)OpenGL對象杭朱。對OpenGL對象的操作就是對這些資源的整合和操作袱吆。它具有強(qiáng)大的跨編程語言和跨平臺(tái)的兼容性捺癞。
跨編程語言:OpenGL官方網(wǎng)頁中列出了用于Java、Fortran 90污朽、Perl、Pike龙考、Python蟆肆、Ada和Visual Basic的多個(gè)綁定矾睦。
跨平臺(tái):Windows、Mac OS炎功、Linux枚冗、Unix。
OpenGL操作的是GPU芯片蛇损,關(guān)于窗口系統(tǒng)的view官紫、window并不是OpenGL來操作,而是相對的iOS或Android系統(tǒng)來完成的州藕。
OpenGL是一種圖形應(yīng)用程序編程接口束世,簡單理解就是開發(fā)圖形庫。
? ??可以用來做:????
????視頻床玻、圖形毁涉、圖片處理;????
????2D锈死、3D游戲引擎開發(fā)??
? ? 科學(xué)可視化??
? ? 醫(yī)學(xué)軟件開發(fā)??
? ? CAD(計(jì)算機(jī)輔助技術(shù))??
? ? 虛擬實(shí)境(AR贫堰、VR)??
? ? AI人工智能
OpenGL ES(OpenGL for Embedded Systems)是OpenGL的子集。針對移動(dòng)終端或游戲主機(jī)等嵌入式設(shè)備而設(shè)計(jì)的待牵,去除了很多不必要和性能較低的API接口其屏。
現(xiàn)在主要 有兩個(gè)版本,OpenGL ES 1.x 針對固定管線硬件的缨该,OpenGL ES 2.x 針對可編程管線硬件偎行。OpenGL ES 1.0 是以 OpenGL 1.3 規(guī)范為基礎(chǔ)的,OpenGL ES 1.1 是以 OpenGL 1.5 規(guī)范為基礎(chǔ)的贰拿,它們分別又支持 common 和 common lite 兩種profile蛤袒。lite profile只支持定點(diǎn)定點(diǎn)實(shí)數(shù),而common profile既支持定點(diǎn)數(shù)又支持浮點(diǎn)數(shù)膨更。 OpenGL ES 2.0 則是參照 OpenGL 2.0 規(guī)范定義的妙真,common profile發(fā)布于2005-8,引入了對可編程管線的支持荚守。
支持平臺(tái)珍德、機(jī)型:?
- 支持iPad, iPhone3GS 和后續(xù)版本,以及iPodTouch3代和后續(xù)版本矗漾。
- 支持Android平臺(tái)從Android 2.2版本開始锈候。
- 支持Android NDK從Android 2.0版本開始。
- 支持BlackBerryPlayBook黑莓缩功。
- 支持Pandora潘多拉控制臺(tái)的3D庫晴及。
- 被WebGL支持:瀏覽器支持OpenGL?
- 支持少數(shù)新款Nokia諾基亞手機(jī),比如N900上的Maemo和N8上的Symbian3塞班3系統(tǒng)嫡锌。??
- 支持多款三星手機(jī)虑稼,包括Galaxy S和Wave琳钉。??
- 使用開發(fā)插件可以支持Palm webOS。? ?
- 支持Archos 愛可視上網(wǎng)本:70 IT, 101 IT蛛倦。
Metal:在WWDC?2014 上歌懒,Apple為游戲開發(fā)者推出了新的平臺(tái)技術(shù) Metal,該技術(shù)能夠?yàn)?3D 圖像提高 10 倍的渲染性能溯壶,并支持大家熟悉的游戲引擎及公司
相對于OpenGL而言及皂,Metal在iOS端的圖形渲染能力上做到了極致。是一種低層次的渲染應(yīng)用程序編程接口且改,提供了軟件所需的最低層验烧,保證軟件可以運(yùn)行在不同的圖形芯片上。Metal 提升了 A7 與 A8 處理器效能又跛,讓其性能完全發(fā)揮碍拆。 可以這樣理解,Metal相對于OpenGL ES來說就是swift相對于objective-C慨蓝。盡管蘋果大力推崇swift感混,但是還是有大部分開發(fā)者喜歡使用objective-C,甚至在2018年編程語言排名中礼烈,objective-C強(qiáng)勢反彈回前十弧满。Metal雖然在極致渲染方面強(qiáng)于OpenGL,但是兼容性能不足此熬,市場占有率和對于開發(fā)者的學(xué)習(xí)吸引力可能弱于OpenGL庭呜。只能說未來可期吧~
在應(yīng)用程序調(diào)用任何OpenGL指令之前,需要安排首先創(chuàng)建一個(gè)OpenGL的上下文摹迷。這個(gè)上下文是一個(gè)非常龐大的狀態(tài)機(jī)疟赊,保存了OpenGL中的各種狀態(tài),這也是OpenGL指令執(zhí)行的基礎(chǔ)峡碉。每一個(gè)硬件GPU是個(gè)服務(wù)器,每一個(gè)繪制上下文對應(yīng)于申請的一個(gè)客戶端驮审,一個(gè)客戶端維護(hù)著一套狀態(tài)機(jī)鲫寄,如果兩個(gè)窗口分別對應(yīng)兩個(gè)不同的繪制上下文,則兩個(gè)窗口彼此狀態(tài)獨(dú)立疯淫。
OpenGL的函數(shù)不管在哪個(gè)語言中地来,都是類似C語言一樣的面向過程的函數(shù),本質(zhì)上面都是對OpenGL上下文這個(gè)龐大的狀態(tài)機(jī)中的某個(gè)狀態(tài)或者對象進(jìn)行操作熙掺。通過對OpenGL指令的封裝未斑,是可以將OpenGL的相關(guān)調(diào)用封裝成為一個(gè)面向?qū)ο蟮膱D形API的。
OpenGL上下文(Context)
由于OpenGL上下文是一個(gè)巨大的狀態(tài)機(jī)币绩,切換上下文往往會(huì)產(chǎn)生較大的開銷蜡秽。但是不同的繪制模塊府阀,可能需要使用完全獨(dú)立的狀態(tài)管理。因此芽突,可以在應(yīng)用程序中分別創(chuàng)建多個(gè)不同的上下文试浙,在不同的線程中使用不同的上下文,上下文之間共享紋理寞蚌、緩沖區(qū)等資源田巴。這樣的方案,會(huì)比反復(fù)切換上下文挟秤,或者大量修改渲染狀態(tài)壹哺,更加合理高效的。
OpenGL狀態(tài)機(jī)
狀態(tài)機(jī)理論上是一種機(jī)器艘刚,其實(shí)我們可以這樣去理解管宵,狀態(tài)機(jī)描述了一個(gè)對象在其生命周期中所經(jīng)歷的各種狀態(tài),狀態(tài)之間的轉(zhuǎn)變昔脯,發(fā)生轉(zhuǎn)變的動(dòng)因啄糙,條件以及轉(zhuǎn)變中所執(zhí)行的活動(dòng)。
? ?為什么說OpenGL是狀態(tài)機(jī)云稚?
1. OpenGL可以記錄自己的狀態(tài)(比如:當(dāng)前所使用的顏色隧饼、是否開啟了混合功能,等等静陈,這些都是要記錄的)
2. OpenGL可以接收輸入(當(dāng)我們調(diào)用OpenGL函數(shù)的時(shí)候燕雁,實(shí)際上可以看成OpenGL在接收我們的輸入),根據(jù)輸入的內(nèi)容和自己的狀態(tài)鲸拥,修改自己的狀態(tài)拐格,并且可以得到輸出(比如我們調(diào)用glColor3f,則OpenGL接收到這個(gè)輸入后會(huì)修改自己的“當(dāng)前顏色”這個(gè)狀態(tài)刑赶;我們調(diào)用glRectf捏浊,則OpenGL會(huì)輸出一個(gè)矩形)
3. OpenGL可以進(jìn)入停止?fàn)顟B(tài),不再接收輸入撞叨。這個(gè)可能在我們的程序中表現(xiàn)得不太明顯金踪,不過在程序退出前,OpenGL總會(huì)先停止工作的牵敷。?
渲染(Rendering)
將圖形/圖像數(shù)據(jù)轉(zhuǎn)換成3D空間圖像操作叫做渲染胡岔。例如,在圖片或者視頻進(jìn)行解碼之后枷餐,形成了一大堆的二進(jìn)制文件靶瘸,然后我們將這一堆的二進(jìn)制文件顯示到屏幕上面的過程就可以理解為渲染。
頂點(diǎn)數(shù)據(jù)(Vertex Data)
一個(gè)頂點(diǎn)是一個(gè)3D坐標(biāo)(也就是x、y怨咪、z數(shù)據(jù))屋剑。三個(gè)3D坐標(biāo)組成一個(gè)三角形。而頂點(diǎn)數(shù)據(jù)是用頂點(diǎn)屬性(Vertex Attributes)表示的惊暴,它可以包含任何我們希望用的數(shù)據(jù)饼丘。
頂點(diǎn)數(shù)組(VertexArray)
頂點(diǎn)是我們在繪制一個(gè)圖形的時(shí)候,頂點(diǎn)的位置數(shù)據(jù)辽话,這個(gè)數(shù)據(jù)是可以直接存儲(chǔ)在數(shù)組中或者將其緩存在GPU內(nèi)存(棧區(qū))中的肄鸽。頂點(diǎn)數(shù)組就是我們在畫畫的時(shí)候,最開始畫的一個(gè)大致的骨架油啤。在OpenGL中的圖像都是由圖元組成典徘。在OpenGL ES中,有三種圖元:點(diǎn)益咬、線逮诲、三角形。我們通過設(shè)定函數(shù)的指針幽告,將頂點(diǎn)數(shù)據(jù)存儲(chǔ)在內(nèi)存中梅鹦,然后需要繪制的時(shí)候,直接從內(nèi)存中取出來使用冗锁。這一部分的數(shù)據(jù)其實(shí)就是頂點(diǎn)數(shù)組齐唆。
頂點(diǎn)緩沖區(qū)(VertexBuffer)
我們上面說了,我們在調(diào)用繪制方法的時(shí)候冻河,直接就由內(nèi)存?zhèn)魅腠旤c(diǎn)數(shù)據(jù)箍邮。還有一種更加高性能的方法,就是提前分配一快內(nèi)存叨叙,將頂點(diǎn)數(shù)據(jù)預(yù)先傳入到顯存當(dāng)中锭弊,這部分的顯存,就叫做頂點(diǎn)緩沖區(qū)擂错。值得注意的是味滞,這一塊空間不再內(nèi)存中,而是在顯存的一塊空間中钮呀。
管線
因?yàn)槲覀兊腉PU在處理數(shù)據(jù)的時(shí)候桃犬,是通過一個(gè)固定的順序來的,這個(gè)順序不能被打破行楞。類似一個(gè)流水線的形式,所以被稱之為管線土匀。
固定管線/存儲(chǔ)著色器
在早期的OpenGL版本子房,它封裝了很多著色器程序塊內(nèi)置的一段包含了光照、坐標(biāo)變換、裁剪等等諸多功能的固定shader程序來完成证杭,來幫助開發(fā)者來完成圖形的渲染田度。而開發(fā)者只需要傳入相應(yīng)的參數(shù),就能快速完成圖形的渲染解愤,類似于iOS開發(fā)會(huì)封裝很多的API镇饺。而我們只需要調(diào)用,就可以實(shí)現(xiàn)功能送讲,不需要關(guān)注底層實(shí)現(xiàn)原理奸笤。OpenGL的使用場景非常豐富,固定管線或存儲(chǔ)著色器無法完成所有業(yè)務(wù)哼鬓,所以將相關(guān)部分開放成可編程狀態(tài)监右。
著色器程序(Shader)
將固定渲染管線架構(gòu)變成可編程渲染管線。OpenGL在實(shí)際調(diào)?繪制函數(shù)之前异希,還需要指定一個(gè)由shader編譯成的著色器程序健盒。
常見的著色器主要有:????
????頂點(diǎn)著?器(VertexShader)????
?????段著?器 (FragmentShader)/像素著?器(PixelShader)/片元著色器/圖元著色器?
?????何著?器 (GeometryShader)?
?????曲?細(xì)分著?器(TessellationShader)?段著?器和像素著?器只是在OpenGL和DX中的不同叫法?而已〕撇荆可惜的是扣癣,直到 OpenGLES 3.0,依然只支持了頂點(diǎn)著?器和片段著?器這兩個(gè)最基礎(chǔ)的著?器憨降。
OpenGL在處理shader時(shí)父虑,和其他編譯器一樣。通過編譯券册、鏈接等步驟频轿,?成了著?器程序(glProgram),著?器程序同時(shí)包含了頂點(diǎn)著?器和?段著?器的運(yùn)算邏輯烁焙。
在OpenGL進(jìn)行繪制的時(shí)候航邢,?先由頂點(diǎn)著?器對傳?的頂點(diǎn)數(shù)據(jù)進(jìn)行運(yùn)算。再通過圖元裝配骄蝇,將頂點(diǎn)轉(zhuǎn)換為圖元膳殷。然后進(jìn)行光柵化,將圖元這種矢量圖形九火,轉(zhuǎn)換為柵格化數(shù)據(jù)赚窃。最后,將柵格化數(shù)據(jù)傳入?段著?器中進(jìn)行運(yùn)算岔激。?段著?器會(huì)對柵格化數(shù)據(jù)中的每一個(gè)像素進(jìn)行運(yùn)算勒极,并決定像素的顏?。
頂點(diǎn)著色器(VertexShader)
一般用來處理圖形每個(gè)頂點(diǎn)變換虑鼎,即:旋轉(zhuǎn)/平移/投影等辱匿。
頂點(diǎn)著色器是OpenGL中用于計(jì)算頂點(diǎn)屬性的程序键痛。頂點(diǎn)著色器是逐個(gè)頂點(diǎn)運(yùn)算的程序,也就是說每個(gè)頂點(diǎn)數(shù)據(jù)都會(huì)執(zhí)行一次頂點(diǎn)著色器匾七,當(dāng)然這是并行的絮短,并且頂點(diǎn)著色器運(yùn)算過程中無法訪問其他頂點(diǎn)的數(shù)據(jù)
一般來說典型的需要計(jì)算的頂點(diǎn)屬性包括頂點(diǎn)坐標(biāo)變換、逐個(gè)頂點(diǎn)光照運(yùn)算等等昨忆。頂點(diǎn)坐標(biāo)由自身坐標(biāo)系轉(zhuǎn)換到歸一化做標(biāo)記的運(yùn)算丁频,就是在這里發(fā)生的。
屬性 : 用頂點(diǎn)數(shù)組提供的逐頂點(diǎn)數(shù)據(jù)邑贴;
統(tǒng)一變量和統(tǒng)一變量緩沖區(qū) : 頂點(diǎn)著色器使用的不變數(shù)據(jù)席里;
采樣器 : 代表頂點(diǎn)著色器使用的紋理的特殊統(tǒng)一變量類型;
著色器程序 : 頂點(diǎn)著色器程序源代碼或者描述在操作頂點(diǎn)的可執(zhí)行文件痢缎。
片元著色器 (FragmentShader)
一般用來處理圖形中每個(gè)像素點(diǎn)顏色計(jì)算和填充
片段著色器是OpenGL中用于計(jì)算片段(像素)顏色的程序胁勺。片段著色器是逐個(gè)像素運(yùn)算的程序,也就是說每個(gè)像素都會(huì)執(zhí)行一次片段著色器独旷,當(dāng)然也是并行的署穗。
片元著色器是一個(gè)處理片元值及其相關(guān)聯(lián)數(shù)據(jù)的可編程單元,片元著色器可執(zhí)行紋理的訪問嵌洼、顏色的匯總案疲、霧化等操作,每片元執(zhí)行一次麻养。片元著色器替代了紋理褐啡、顏色求和、霧以及Alpha測試鳖昌,這一部分是需要開發(fā)者自己開發(fā)的备畦。GLSL(OpenGL Shading language)
光柵化(Rasterization)
官方翻譯成柵格化或者像素化。光柵化就是把頂點(diǎn)數(shù)據(jù)轉(zhuǎn)換為片元的過程许昨,實(shí)際繪制或填充每個(gè)定點(diǎn)之間的像素行程過程懂盐。片元中的每一個(gè)元素對應(yīng)于幀緩沖區(qū)中的一個(gè)像素。該過程包含了兩部分的工作糕档。第一部分工作:決定了窗口坐標(biāo)中哪些整型格柵區(qū)域被基本圖元占用莉恼。第二部分工作:分配一個(gè)顏色值和一個(gè)深度值到各個(gè)區(qū)域。光柵化過程產(chǎn)生的是片元速那。
把物體的數(shù)學(xué)描述以及與物體相關(guān)的顏色信息轉(zhuǎn)換為屏幕上用于對應(yīng)位置的像素及?于填充像素的顏色俐银,這個(gè)過程稱為光柵化,這是一個(gè)將模擬信號(hào)轉(zhuǎn)化為離散信號(hào)的過程端仰。
紋理
紋理可以理解為一個(gè)圖片捶惜,也就是位圖。?家在渲染圖形時(shí)需要在其編碼填充圖?,為了使得場景更加逼真.?這里使?的圖片,就是常說的紋理.但是在OpenGL,我們更加習(xí)慣叫紋理,?不是圖片荔烧。
OpenGL要求紋理的高度和寬度都必須是2的n次方大小售躁,只有滿足這個(gè)條件坞淮,這個(gè)紋理圖片才是有效的。一般使用uv來表示紋理坐標(biāo)陪捷,uv是一個(gè)二維向量(u,v),u和v的取值從0到1诺擅。我在代碼中為每個(gè)頂點(diǎn)數(shù)據(jù)增加了2個(gè)GLFloat來表示uv的值市袖。
使用OpenGL函數(shù)生成紋理,除了使用GLKit生成紋理之外烁涌,還可以直接使用OpenGL生成紋理苍碟。
1、將圖片的數(shù)據(jù)以RGBA的形式導(dǎo)出撮执;
2微峰、使用glGenTextures生成紋理,這里生成的紋理就相當(dāng)于上面說到的self.diffuseTexture.name抒钱;
3蜓肆、使用glBindTexture綁定紋理到GL_TEXTURE_2D;
4谋币、使用glTexImage2D寫圖片數(shù)據(jù)仗扬,我們的圖片數(shù)據(jù)已經(jīng)統(tǒng)一導(dǎo)出成RGBA格式了,所以顏色格式參數(shù)使用GL_RGBA蕾额。每個(gè)顏色組件參數(shù)使用GL_UNSIGNED_BYTE早芭,就是說R,G诅蝶,B退个,A每個(gè)數(shù)據(jù)各占一個(gè)字節(jié)的大小调炬;
5语盈、使用glTexParameteri設(shè)置采樣方式和重復(fù)方式,每個(gè)方式具體的效果大家可以自行修改例子觀察一下筐眷。重復(fù)方式主要用于uv超出0到1的場景黎烈;
6、glBindTexture(GL_TEXTURE_2D, 0);是為了清空GL_TEXTURE_2D綁定的數(shù)據(jù)匀谣,可以把GL_TEXTURE_2D理解為一個(gè)工作臺(tái)照棋,你處理完了你的事情需要把工作臺(tái)清理干凈。
混合(gl_blend)
在測試階段之后武翎,如果像素依然沒有被剔除烈炭,那么像素的顏色將會(huì)和幀緩沖區(qū)中顏色附著上的顏色進(jìn)行混合,混合的算法可以通過OpenGL的函數(shù)進(jìn)行指定宝恶。但是OpenGL提供的混合算法是有限的符隙,如果需要更加復(fù)雜的混合算法趴捅,?般可以通過像素著?器進(jìn)行實(shí)現(xiàn),當(dāng)然性能會(huì)比原生的混合算法差一些霹疫。
混合常用來繪制透明或半透明的物體拱绑。在混合中起關(guān)鍵作用的α值實(shí)際上是將源色和目標(biāo)色按給定比率進(jìn)行混合,以達(dá)到不同程度的透明丽蝎。α值為0則完全透明猎拨,α值為1則完全不透明⊥雷瑁混合操作只能在RGBA模式下進(jìn)行红省,顏色索引模式下無法指定α值。物體的繪制順序會(huì)影響到OpenGL的混合處理国觉。
glEnable( GL_BLEND ); ? // 啟用混合
glDisable( GL_BLEND );? // 禁用關(guān)閉混合
矩陣變換(Transformation)
圖形想發(fā)生平移,縮放,旋轉(zhuǎn)變換吧恃。就需要使用變換矩陣。
Peakin 來源:CSDN 原文:https://blog.csdn.net/u014587123/article/details/80337627
模型變換:
????模型變換解決的是麻诀,把物體在世界坐標(biāo)系下的位置拆分成平移痕寓、縮放、旋轉(zhuǎn)的表達(dá)方式针饥。?
視圖變換:
????視圖變換的作用可以理解為厂抽,指定一個(gè)照相機(jī)的位置和角度。
投影變換:
????投影變換是把前面在三維空間中的坐標(biāo)投影到二維屏幕坐標(biāo)丁眼,但是計(jì)算結(jié)果也是一個(gè)三維坐標(biāo)(嚴(yán)格來說是四維的筷凤,還有個(gè)齊次的 1),除了屏幕的橫縱坐標(biāo)之外苞七,另一個(gè)維度就是垂直屏幕方向上的深度坐標(biāo)藐守,就是之后可以寫入深度緩沖器的值。
視口變換:
????視口變換蹂风,這里只是一個(gè)非常簡單的 X-Y 平面上的縮放卢厂,它決定了最終渲染到屏幕上的哪一塊區(qū)域。
變換結(jié)果:
????變換后的坐標(biāo) = 視口矩陣 x 投影矩陣 x 視圖矩陣 x 模型矩陣 x 模型點(diǎn)坐標(biāo) 其中模型點(diǎn)坐標(biāo)和變換后的坐標(biāo)是 1x4 的向量惠啄,其他矩陣都是 4x4 的慎恒。 規(guī)定:OpenGL的向量為列向量,矩陣和向量采用的方式又是“矩陣X列向量”的方式撵渡,當(dāng)多個(gè)矩陣乘以向量時(shí)融柬,應(yīng)該從右向左計(jì)算。故上式的計(jì)算順序?yàn)槟P忘c(diǎn)坐標(biāo)先與模型矩陣相乘趋距,再與視圖矩陣相乘粒氧,投影矩陣和視口矩陣,最后得到變換后的坐標(biāo)节腐。
投影矩陣(Projection)
負(fù)責(zé)給場景增加透視外盯;?于將3D坐標(biāo)轉(zhuǎn)換為二維屏幕坐標(biāo),實(shí)際線條也將在二維坐標(biāo)下進(jìn)行繪制摘盆。
投影矩陣P:滿足P^2=P
正交矩陣矩陣P:P'=P=P^2
超定線性方程組Ax=b通常化成解PAx=Pb饱苟,其中P是全空間到A的值域Im(A)的投影孩擂,經(jīng)等價(jià)變換可得A'Ax=A'b
在線性代數(shù)和泛函分析中,投影是從向量空間映射到自身的一種線性變換掷空,是日常生活中“平行投影”概念的形式化和一般化肋殴。同現(xiàn)實(shí)中陽光將事物投影到地面上一樣,投影變換將整個(gè)向量空間映射到它的其中一個(gè)子空間坦弟,并且在這個(gè)子空間中是恒等變換。
渲染上屏/交換緩沖區(qū)(SwapBuffer)
常規(guī)的OpenGL程序?至少都會(huì)有兩個(gè)緩沖區(qū)官地。顯示在屏幕上的稱為屏幕緩沖區(qū)酿傍,沒有顯示的稱為離屏緩沖區(qū)。在一個(gè)緩沖區(qū)渲染完成之后驱入,通過將屏幕緩沖區(qū)和離屏緩沖區(qū)交換赤炒,實(shí)現(xiàn)圖像在屏幕上的顯示。
當(dāng)我們想把一個(gè)圖像渲染到窗口的時(shí)候亏较,GPU會(huì)開辟一個(gè)渲染緩沖區(qū)莺褒。但是每一個(gè)窗口又只有一個(gè)緩沖區(qū),那么如果在繪制的過程中屏幕進(jìn)行了刷新雪情,窗口顯示的畫面就有可能不完整遵岩。為了解決這個(gè)問題,常規(guī)的OpenGL程序至少都會(huì)有兩個(gè)緩沖區(qū)巡通。顯示在屏幕上的稱為屏幕緩沖區(qū)尘执,沒有顯示的稱為離屏緩沖區(qū),在一個(gè)緩沖區(qū)渲染完成之后宴凉,通過將屏幕緩沖區(qū)和離屏緩沖區(qū)交換誊锭,實(shí)現(xiàn)圖像在屏幕上的顯示。在iOS中經(jīng)常遇到的離屏渲染弥锄,其實(shí)就是雙緩沖區(qū)的機(jī)制引起的丧靡。