版本記錄
版本號 | 時間 |
---|---|
V1.0 | 2017.10.01 |
前言
OpenGL ES是一個強大的圖形庫弃酌,是跨平臺的圖形API薪棒,屬于OpenGL的一個簡化版本艰毒。iOS系統(tǒng)可以利用OpenGL ES將圖像數(shù)據(jù)直接送入到GPU進行渲染愤诱,這樣避免了從CPU進行計算再送到顯卡渲染帶來的性能的高消耗挽放,能帶來來更好的視頻效果和用戶體驗。接下來幾篇就介紹下iOS 系統(tǒng)的 OpenGL ES框架骡技。感興趣的可以看上面幾篇鸣个。
1. OpenGL ES 框架詳細解析(一) —— 基本概覽
2. OpenGL ES 框架詳細解析(二) —— 關于OpenGL ES
3. OpenGL ES 框架詳細解析(三) —— 構建用于iOS的OpenGL ES應用程序的清單
4. OpenGL ES 框架詳細解析(四) —— 配置OpenGL ES的上下文
5. OpenGL ES 框架詳細解析(五) —— 使用OpenGL ES和GLKit進行繪制
6. OpenGL ES 框架詳細解析(六) —— 繪制到其他渲染目的地
7. OpenGL ES 框架詳細解析(七) —— 多任務,高分辨率和其他iOS功能
8. OpenGL ES 框架詳細解析(八) —— OpenGL ES 設計指南
Tuning Your OpenGL ES App - 調整您的OpenGL ES應用程序
iOS中OpenGL ES應用程序的性能與OS X或其他桌面操作系統(tǒng)中OpenGL的性能不同布朦。 雖然功能強大的計算設備囤萤,基于iOS設備的桌面或筆記本電腦不具備內存或CPU功能。 嵌入式GPU通過與典型的臺式機或筆記本電腦GPU可能使用的算法不同是趴,優(yōu)化了較低的內存和功耗涛舍。 低效渲染圖形數(shù)據(jù)可能會導致較差的幀速率,或顯著降低基于iOS設備的電池壽命唆途。
后面的章節(jié)介紹了許多提高應用程序性能的技術; 本章涵蓋整體策略富雅。 除非另有說明掸驱,否則本章中的建議涉及OpenGL ES的所有版本。
Debug and Profile Your App with Xcode and Instruments - 使用Xcode和儀器調試和配置您的應用程序
在各種設備上的各種場景中測試其性能之前没佑,請勿優(yōu)化應用程序毕贼。 Xcode
和Instruments
包括幫助您確定應用程序中的性能和正確性問題的工具。
- 監(jiān)視Xcode調試量表图筹,以了解性能的一般概述帅刀。 當您從Xcode運行應用程序時,可以看到這些儀表远剩,以便在開發(fā)應用程序時輕松發(fā)現(xiàn)性能變化扣溺。
- 使用儀器中的OpenGL ES分析和OpenGL ES驅動程序工具,以更深入地了解運行時性能瓜晤。 獲取關于您的應用程序的資源使用和符合OpenGL ES最佳做法的詳細信息锥余,并選擇性地禁用部分圖形管道,以便您可以確定哪個部分是您的應用程序中的重大瓶頸痢掠。 有關更多信息驱犹,請參閱 Instruments User Guide。
- 在Xcode中使用OpenGL ES Frame Debugger和性能分析器工具來精確定位性能和渲染問題足画。 捕獲用于渲染和呈現(xiàn)單個幀的所有OpenGL ES命令雄驹,然后遍歷這些命令,以查看每個對OpenGL ES狀態(tài)淹辞,綁定的資源和輸出幀緩沖區(qū)的影響医舆。 您還可以查看著色器源代碼,編輯它象缀,并查看更改如何影響渲染的圖像蔬将。 在支持OpenGL ES 3.0的設備上,F(xiàn)rame Debugger還指出哪些繪圖調用和著色器指令對渲染時間最有貢獻央星。 有關這些工具的更多信息霞怀,請參閱Xcode OpenGL ES Tools Overview。
1. Watch for OpenGL ES Errors in Xcode and Instruments - 在Xcode和Instruments中觀察OpenGL ES錯誤
當您的應用程序使用OpenGL ES API
錯誤(例如莉给,通過請求操作底層硬件無法執(zhí)行)時毙石,會出現(xiàn)OpenGL ES錯誤。 即使您的內容正確呈現(xiàn)颓遏,這些錯誤也可能表明性能問題胁黑。 檢查OpenGL ES錯誤的傳統(tǒng)方法是調用glGetError
函數(shù); 但是,重復調用此功能可能會顯著降低性能州泊。 應該使用上述工具來測試錯誤:
- 在Instruments中分析您的應用程序時,請參閱OpenGL ES Analyzer工具的詳細信息窗格漂洋,查看錄制時報告的任何OpenGL ES錯誤遥皂。
- Xcode中調試應用程序時力喷,捕獲一個幀以檢查用于生成它的繪圖命令,以及執(zhí)行這些命令時遇到的任何錯誤演训。
當遇到OpenGL ES錯誤時弟孟,還可以配置Xcode以停止程序執(zhí)行。 (請參閱Adding an OpenGL ES Error Breakpoint
样悟。)
2. Annotate Your OpenGL ES Code for Informative Debugging and Profiling - 注釋您的OpenGL ES代碼進行信息調試和分析
您可以通過將OpenGL ES命令組織到邏輯組中并為OpenGL ES對象添加有意義的標簽來使調試和分析更加高效拂募。 這些組和標簽出現(xiàn)在Xcode中的OpenGL ES Frame Debugger
中,如下圖所示窟她,在儀器中的OpenGL ES Analyzer
中陈症。 要添加組和標簽,請使用EXT_debug_marker
和EXT_debug_label
擴展震糖。
當您有一系列繪圖命令代表一個有意義的操作 - 例如繪制游戲角色時录肯,您可以使用標記將其分組進行調試。 下面代碼顯示了如何對紋理吊说,程序论咏,頂點數(shù)組和場景的單個元素繪制調用。 首先颁井,它調用glPushGroupMarkerEXT
函數(shù)來提供有意義的名稱厅贪,然后發(fā)出一組OpenGL ES命令。 最后雅宾,它關閉組养涮,并調用glPopGroupMarkerEXT
函數(shù)。
// Using a debug marker to annotate drawing commands
glPushGroupMarkerEXT(0, "Draw Spaceship");
glBindTexture(GL_TEXTURE_2D, _spaceshipTexture);
glUseProgram(_diffuseShading);
glBindVertexArrayOES(_spaceshipMesh);
glDrawElements(GL_TRIANGLE_STRIP, 256, GL_UNSIGNED_SHORT, 0);
glPopGroupMarkerEXT();
您可以使用多個嵌套標記來在復雜場景中創(chuàng)建有意義的組的層次結構秀又。 當您使用GLKView
類繪制OpenGL ES內容時单寂,它會自動創(chuàng)建一個“渲染”組,其中包含繪圖方法中的所有命令吐辙。 您創(chuàng)建的任何標記都嵌套在此組內宣决。
標簽為OpenGL ES對象提供有意義的名稱,例如紋理昏苏,著色器程序和頂點數(shù)組對象尊沸。 調用glLabelObjectEXT
函數(shù)為對象提供調試和分析時要顯示的名稱。 下面代碼說明了使用這個函數(shù)來標記一個頂點數(shù)組對象贤惯。 如果您使用GLKTextureLoader類加載紋理數(shù)據(jù)洼专,它會自動標記其使用其文件名創(chuàng)建的OpenGL ES紋理對象。
// Using a debug label to annotate an OpenGL ES object
glGenVertexArraysOES(1, &_spaceshipMesh);
glBindVertexArrayOES(_spaceshipMesh);
glLabelObjectEXT(GL_VERTEX_ARRAY_OBJECT_EXT, _spaceshipMesh, 0, "Spaceship");
General Performance Recommendations - 一般性能推薦
使用常識來指導您的性能調整工作孵构。 例如屁商,如果您的應用程序每幀僅繪制幾十個三角形,更改提交頂點數(shù)據(jù)的方式將不太可能提高其性能颈墅。 尋找為您的努力提供最佳性能的優(yōu)化蜡镶。
1. Redraw Scenes Only When the Scene Data Changes - 僅當場景數(shù)據(jù)更改時才重畫場景
您的應用程序應該等待雾袱,直到場景中的某些內容發(fā)生變化才能渲染新的幀 核心動畫緩存呈現(xiàn)給用戶的最后一張圖像,并繼續(xù)顯示官还,直到出現(xiàn)新的幀芹橡。
即使您的數(shù)據(jù)發(fā)生變化,也不需要以硬件處理命令的速度渲染幀望伦。 對于用戶來說林说,速度較慢但固定的幀速率通常比快速但可變的幀速率更平滑。 每秒30幀的固定幀速率對于大多數(shù)動畫是足夠的屯伞,并且有助于降低功耗腿箩。
2. Disable Unused OpenGL ES Features - 禁用未使用的OpenGL ES功能
最好的計算是您的應用程序從未執(zhí)行的計算。 例如愕掏,如果結果可以預先計算并存儲在模型數(shù)據(jù)中度秘,則可以避免在運行時執(zhí)行該計算。
如果您的應用程序是針對OpenGL ES 2.0或更高版本編寫的饵撑,請勿創(chuàng)建一個具有大量開關和條件的單一著色器剑梳,以執(zhí)行應用程序渲染場景所需的每個任務。 相反滑潘,編譯多個著色器程序垢乙,每個著色器程序執(zhí)行一個特定的,重點任務语卤。
如果您的應用程序使用OpenGL ES 1.1追逮,請禁用任何不需要渲染場景的固定功能操作。 例如粹舵,如果您的應用程序不需要照明或混合钮孵,請禁用這些功能。 同樣眼滤,如果您的應用程序僅繪制2D模型巴席,則應禁用霧度和深度測試。
3. Simplify Your Lighting Models - 簡化您的照明模型
這些準則既適用于OpenGL ES 1.1中的固定功能照明诅需,又適用于您在OpenGL ES 2.0或更高版本中的自定義著色器中使用的基于著色器的照明計算漾唉。
為您的應用程序使用最少的燈和最簡單的照明類型。 考慮使用定向燈而不是點光源堰塌,點光源這需要更多的計算赵刑。 著色器應在模型空間中執(zhí)行照明計算; 在更復雜的照明算法中,考慮在著色器中使用更簡單的照明方程场刑。
預先計算您的照明般此,并將顏色值存儲在可通過片段處理進行采樣的紋理中。
Use Tile-Based Deferred Rendering Efficiently - 有效地使用基于平鋪的延遲渲染
iOS設備中使用的所有GPU都使用基于瓦片的延遲渲染(TBDR)。 當您調用OpenGL ES函數(shù)向硬件提交呈現(xiàn)命令時恤煞,這些命令將被緩沖屎勘,直到累積了大量命令。 在呈現(xiàn)renderbuffer
或刷新命令緩沖區(qū)之前居扒,硬件不會開始處理頂點和陰影像素。 然后丑慎,它們將這些命令作為單個操作喜喂,通過將幀緩沖區(qū)劃分為圖塊,然后為每個圖塊繪制一次命令竿裂,每個圖塊只渲染其中可見的圖元玉吁。 (GLKView類在繪圖方法返回后呈現(xiàn)renderbuffer,如果使用CAEAGLLayer
類創(chuàng)建自己的renderbuffer來顯示腻异,則使用OpenGL ES上下文的presentRenderbuffer:方法來呈現(xiàn)它进副,glFlush
或glFinish
函數(shù)刷新命令緩沖區(qū)。
由于瓦片內存是GPU硬件的一部分悔常,渲染過程的一部分(如深度測試和混合)在時間和能量使用方面比傳統(tǒng)的基于流的GPU架構更為高效影斑。 因為這個架構一次處理整個場景的所有頂點,GPU可以在片段被處理之前執(zhí)行隱藏的表面去除机打。 不可見的像素在沒有采樣紋理或執(zhí)行片段處理的情況下被丟棄矫户,大大減少了GPU必須執(zhí)行的渲染圖塊的計算。
在傳統(tǒng)的基于流的渲染器上有用的渲染策略在iOS圖形硬件上具有高性能成本残邀。 遵循以下準則可以幫助您的應用在TBDR
硬件上表現(xiàn)良好皆辽。
1. Avoid Logical Buffer Loads and Stores - 避免邏輯緩沖區(qū)負載和存儲
當TBDR圖形處理器開始渲染圖塊時,必須首先將幀緩沖區(qū)的該部分的內容從共享內存?zhèn)鬏數(shù)紾PU上的瓦片內存芥挣。 這種內存?zhèn)鬏斍疲Q為邏輯緩沖區(qū)負載,需要時間和精力空免。 大多數(shù)情況下空另,幀緩沖區(qū)的以前內容對于繪制下一幀是不必要的。 當您開始渲染新的幀時鼓蜒,通過調用glClear
避免加載先前緩沖區(qū)內容帶來的性能成本痹换。
類似地,當GPU完成繪制瓦片時都弹,它必須將瓦片的像素數(shù)據(jù)寫回共享存儲器娇豫。 這種稱為邏輯緩沖存儲器的傳輸也具有性能成本。 對于每個繪制的畫面畅厢,至少需要進行一次這樣的轉移冯痢,屏幕上顯示的彩色渲染緩沖區(qū)必須被傳送到共享存儲器,以便Core Animation可以呈現(xiàn)。 在渲染算法中使用的其他幀緩沖附件(例如浦楣,深度袖肥,模板和多采樣緩沖區(qū))不需要保留,因為它們的內容將在下一幀繪制后重新創(chuàng)建振劳。 OpenGL ES會自動將這些緩沖區(qū)存儲到共享內存中椎组,從而導致性能成本 - 除非您明確使其無效。 要使緩沖區(qū)無效历恐,請使用OpenGL ES 3.0中的glInvalidateFramebuffer
命令或OpenGL ES 1.1或2.0中的glDiscardFramebufferEXT
命令寸癌。 (有關詳細信息,請參閱Discard Unneeded Renderbuffers)弱贼,當您使用GLKView類提供的基本繪圖循環(huán)時蒸苇,它會自動使任何可繪制的深度,模板或多重采樣緩沖區(qū)無效吮旅。
如果切換渲染目的地溪烤,也會發(fā)生邏輯緩沖區(qū)存儲和加載操作。 如果渲染到紋理庇勃,然后渲染到視圖的幀緩沖區(qū)檬嘀,然后再次渲染到相同的紋理,則紋理的內容必須在共享內存和GPU之間重復傳輸匪凉。 批量繪制操作枪眉,以便將所有繪制到渲染目的地一起完成。 當切換幀緩沖區(qū)(使用glBindFramebuffer
或glFramebufferTexture2D
函數(shù)或bindDrawable
方法)時再层,會使不需要的幀緩沖附件無效贸铜,以避免導致邏輯緩沖區(qū)存儲。
2. Use Hidden Surface Removal Effectively - 有效地使用隱藏的表面去除
TBDR
圖形處理器自動使用深度緩沖區(qū)為整個場景執(zhí)行隱藏的表面刪除聂受,確保每個像素只運行一個片段著色器蒿秦。 用于減少片段處理的傳統(tǒng)技術不是必需的。 例如蛋济,通過深度從前到后排序對象或原語有效地復制了GPU完成的工作棍鳖,浪費了CPU時間。
當混合或Alpha
測試啟用時碗旅,或者片段著色器使用丟棄指令或寫入gl_FragDepth
輸出變量時渡处,GPU無法執(zhí)行隱藏的表面刪除。 在這些情況下祟辟,GPU無法使用深度緩沖區(qū)來確定片段的可見性医瘫,因此必須對覆蓋每個像素的所有圖元運行片段著色器,從而大大增加渲染幀所需的時間和精力旧困。 為了避免這種性能成本醇份,最小化混合使用稼锅,丟棄指令和深度寫入。
如果您無法避免混合僚纷,Alpha測試或丟棄說明矩距,請考慮以下策略來降低其性能影響:
- 按不透明度排序對象。 先繪制不透明物體怖竭。 接下來锥债,使用丟棄操作(或OpenGL ES 1.1中的Alpha測試)繪制需要著色器的對象。 最后侵状,繪制alpha混合對象赞弥。
- 修剪需要混合或丟棄指令的對象以減少處理的碎片數(shù)量。 例如趣兄,如下圖所示,不是繪制一個正方形來渲染包含大部分空白空間的2D精靈紋理悼嫉,而是繪制一個更貼近圖像形狀的多邊形艇潭。 附加頂點處理的性能成本遠低于運行片段著色器,運行片段著色器的結果將不被使用戏蔑。
- 在片段著色器中盡早使用丟棄指令蹋凝,以避免執(zhí)行結果未使用的計算。
- 不使用alpha測試或丟棄指令來殺死像素总棵,而是將alpha混合與Alpha設置為零鳍寂。 彩色幀緩沖區(qū)未被修改,但圖形硬件仍然可以使用它執(zhí)行的任何Z緩沖區(qū)優(yōu)化情龄。 這樣做會改變存儲在深度緩沖區(qū)中的值迄汛,因此可能需要對透明基元進行前后排序。
- 如果您的表現(xiàn)受到不可避免的丟棄操作限制骤视,請考慮“Z-Prepass”渲染策略鞍爱。 使用簡單的片段著色器渲染場景,只包含丟棄邏輯(避免昂貴的照明計算)來填充深度緩沖區(qū)专酗。 然后睹逃,使用
GL_EQUAL
深度測試功能和您的照明著色器再次渲染您的場景。 雖然多次渲染通常會導致性能損失祷肯,但是這種方法可以產(chǎn)生比涉及大量丟棄操作的單遍渲染更好的性能沉填。
3. Group OpenGL ES Commands for Efficient Resource Management - OpenGL ES命令用于高效的資源管理
上述內存帶寬和計算節(jié)省在處理大型場景時表現(xiàn)最佳。 但是當硬件接收到需要渲染較小場景的OpenGL ES命令時佑笋,渲染器的效率就大大降低翼闹。 例如,如果您的應用程序使用紋理渲染批次的三角形允青,然后修改紋理橄碾,則OpenGL ES實現(xiàn)必須立即刷新這些命令卵沉,或者重復紋理,這兩個選項會有效地使用硬件法牲。 類似地史汗,如果它們會改變該幀緩沖區(qū),從幀緩沖區(qū)讀取像素數(shù)據(jù)的任何嘗試都要求處理前面的命令拒垃。
為了避免這些性能損失停撞,請組織您的OpenGL ES調用序列,以便一起執(zhí)行每個渲染目標的所有繪圖命令悼瓮。
Minimize the Number of Drawing Commands - 最小化繪圖命令的數(shù)量
每當您的應用程序提交要由OpenGL ES處理的圖元時戈毒,CPU將準備圖形硬件的命令。 如果您的應用程序使用許多glDrawArrays
或glDrawElements
調用來渲染場景横堡,則其性能可能受到CPU資源的限制埋市,而不會完全利用GPU。
為了減少這種開銷命贴,尋找將渲染整合到較少繪圖調用中的方法道宅。 有用的策略包括:
- 將多個基元合并成單個三角形條,如Use Triangle Strips to Batch Vertex Data中所述胸蛛。 為獲得最佳效果污茵,請合并在緊密的空間附近繪制的圖元。 大量葬项,蔓延的模型更難以有效地剔除當他們在幀中不可見時泞当。
- 創(chuàng)建紋理地圖集以使用相同紋理圖像的不同部分繪制多個圖元,如Combine Textures into Texture Atlases中所述。
- 使用實例繪制來渲染許多類似的對象,如下所述跪呈。
1. Use Instanced Drawing to Minimize Draw Calls - 使用實例化繪圖來最小化繪制調用
實例繪制命令允許您使用單個繪圖調用多次繪制相同的頂點數(shù)據(jù)。 代替使用CPU時間來設置網(wǎng)格的不同實例(如位置偏移敌蜂,變換矩陣,顏色或紋理坐標)之間的變化津肛,并為每個實例繪制繪制命令章喉,將實例變體的處理移動到著色器代碼中 在GPU上運行
重復使用的頂點數(shù)據(jù)是實例繪制的主要候選者。 例如身坐,下面代碼中的代碼在場景中的多個位置繪制一個對象秸脱。 然而,許多glUniform
和glDrawArrays
調用增加了CPU開銷部蛇,從而降低了性能摊唇。
// Drawing many similar objects without instancing
for (x = 0; x < 10; x++) {
for (y = 0; y < 10; y++) {
glUniform4fv(uniformPositionOffset, 1, positionOffsets[x][y]);
glDrawArrays(GL_TRIANGLES, 0, numVertices);
}
}
采用實例化繪圖需要兩個步驟:首先,如上所述替換循環(huán)涯鲁,單次調用glDrawArraysInstanced
或glDrawElementsInstanced
巷查。 這些調用與glDrawArrays
或glDrawElements
相同有序,但附加參數(shù)指示要繪制的實例數(shù)(上面代碼中的示例為100)。 其次岛请,選擇和實現(xiàn)OpenGL ES為您的頂點著色器使用每個實例信息提供的兩個策略之一旭寿。
使用著色器實例ID策略,您的頂點著色器會導出或查找每個實例信息崇败。 每次頂點著色器運行時盅称,其gl_InstanceID
內置變量都包含一個標識當前正在繪制的實例的數(shù)字。 使用此數(shù)字計算著色器代碼中的位置偏移后室,顏色或其他每個實例的變化缩膝,或者查找統(tǒng)一數(shù)組或其他大容量存儲中的每個實例信息。 例如岸霹,下面代碼使用此技術來繪制位于10 x 10
網(wǎng)格中的100個網(wǎng)格實例疾层。
// OpenGL ES 3.0 vertex shader using gl_InstanceID to compute per-instance information
#version 300 es
in vec4 position;
uniform mat4 modelViewProjectionMatrix;
void main()
{
float xOffset = float(gl_InstanceID % 10) * 0.5 - 2.5;
float yOffset = float(gl_InstanceID / 10) * 0.5 - 2.5;
vec4 offset = vec4(xOffset, yOffset, 0, 0);
gl_Position = modelViewProjectionMatrix * (position + offset);
}
通過實例化的數(shù)組策略,您可以將每個實例信息存儲在頂點數(shù)組屬性中贡避。 您的頂點著色器可以訪問該屬性以使用每個實例信息云芦。 調用glVertexAttribDivisor
函數(shù)來指定OpenGL ES繪制每個實例時該屬性的進度。 下面兩段代碼的第一段演示了為實例繪制設置一個頂點數(shù)組贸桶,第二段顯示了相應的著色器。
// Using a vertex attribute for per-instance information
#define kMyInstanceDataAttrib 5
glGenBuffers(1, &_instBuffer);
glBindBuffer(GL_ARRAY_BUFFER, _instBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(instData), instData, GL_STATIC_DRAW);
glEnableVertexAttribArray(kMyInstanceDataAttrib);
glVertexAttribPointer(kMyInstanceDataAttrib, 2, GL_FLOAT, GL_FALSE, 0, 0);
glVertexAttribDivisor(kMyInstanceDataAttrib, 1);
// OpenGL ES 3.0 vertex shader using instanced arrays
#version 300 es
layout(location = 0) in vec4 position;
layout(location = 5) in vec2 inOffset;
uniform mat4 modelViewProjectionMatrix;
void main()
{
vec4 offset = vec4(inOffset, 0.0, 0.0)
gl_Position = modelViewProjectionMatrix * (position + offset);
}
實例繪圖在核心OpenGL ES 3.0 API
和OpenGL ES 2.0
中通過EXT_draw_instanced
和EXT_instanced_arrays
擴展提供桌肴。
Minimize OpenGL ES Memory Usage - 最小化OpenGL ES內存使用
您的iOS應用程序與系統(tǒng)和其他iOS應用程序共享主內存皇筛。 為OpenGL ES分配的內存減少了您的應用程序中可用于其他用途的內存。 考慮到這一點坠七,只需分配您需要的內存水醋,并在應用程序不再需要它時立即釋放它。 這里有幾種方法可以節(jié)省內存:
- 將圖像加載到OpenGL ES紋理后彪置,釋放原始圖像拄踪。
- 只有在您的應用程序需要時才分配深度緩沖區(qū)。
- 如果您的應用程序不需要一次所有資源拳魁,只需加載一部分項目惶桐。 例如,一個游戲可能被分為幾個級別; 每個都加載適合更嚴格資源限制的總資源的子集潘懊。
iOS中的虛擬內存系統(tǒng)不使用交換文件姚糊。 當檢測到低內存條件時,虛擬內存不會將易失性頁面寫入磁盤授舟,而是釋放非易失性內存救恨,為運行中的應用程序提供所需的內存。 您的應用程序應盡可能少地使用內存释树,并準備處理對應用程序不是必需的對象肠槽。 針對低內存條件的響應在iOS的App Programming Guide for iOS中有詳細介紹擎淤。
Be Aware of Core Animation Compositing Performance - 要注意Core Animation合成性能
Core Animation
將renderbuffers的內容與視圖層次結構中的任何其他圖層相結合,無論這些圖層是用OpenGL ES秸仙,Quartz還是其他圖形庫繪制嘴拢。 這很有幫助,因為這意味著OpenGL ES是核心動畫的first - class citizen
筋栋。 然而炊汤,將OpenGL ES內容與其他內容混合需要時間; 當使用不當時,您的應用程序可能執(zhí)行得太慢弊攘,無法達到交互式幀速率抢腐。
為了獲得最佳性能,您的應用程序應該僅依靠OpenGL ES來呈現(xiàn)您的內容襟交。 將保存OpenGL ES內容的視圖設置為與屏幕匹配迈倍,確保其opaque屬性設置為YES(GLKView對象的默認值),并且不顯示其他視圖或Core Animation圖層捣域。
如果將其渲染為在其他圖層之上合成的Core Animation圖層啼染,則使CAEAGLLayer
對象不透明減少但不會消除性能成本。 如果您的CAEAGLLayer對象在圖層層次結構中的層之下混合在一起焕梅,則renderbuffer
的顏色數(shù)據(jù)必須是由Core Animation正確合成的預乘法alpha
格式迹鹅。 將OpenGL ES內容混合在其他內容之上具有嚴重的性能損失。
后記
未完贞言,待續(xù)~~~