最近項目比較趕,沒看Xcode 8的發布說明,不過,在做性能優化時,發現Instruments工具集比Xcode 7少了幾項,被精簡的工具中有一項對我們項目影響較大,就是GPU Driver。
更新:經各位老司機提醒,Xcode 7添加的UI Test功能上等同於Automation,所以Instruments 8在功能上並沒比上一版本少內容。然而,這幾天使用Instruments 8進行性能調優時,發現它一直提示glInvalidateFramebuffer調用位置有誤,但是,同樣的代碼在Instruments 7並沒此提示。可以確認的是,這段代碼完全遵守WWDC和相關的Programming Guide建議。
Instruments 8提示顯示渲染緩沖區後調用幀緩沖區失效問題Instruments的詳細說明與官方文檔的說法對我而言,是相反的,如下所示:
丟棄多重幀緩沖區數據的官方示例代碼The application called glInvalidateFrameBuffer before presenting the renderbuffer. This is incorrect. If you call glInvalidateFramebuffer, do so after presenting.. renderbuffer ID = 1.
Other framebuffer attachments used in your rendering algorithm (for example, depth, stencil, and multisampling buffers) need not be preserved, because their contents will be recreated on the next frame drawn. OpenGL ES automatically stores these buffers to shared memory—incurring a performance cost—unless you explicitly invalidate them. To invalidate a buffer, use the glInvalidateFramebuffer command in OpenGL ES 3.0 or the glDiscardFramebufferEXT command in OpenGL ES 1.1 or 2.0. When you use the basic drawing cycle provided by GLKView class, it automatically invalidates any drawable depth, stencil, or multisampling buffers it creates.
摘自官方文檔 Tuning Your OpenGL ES App - Avoid Logical Buffer Loads and Stores
如下是我們的代碼,可見,它是按官方建議編寫的。
glBlitFramebuffer(0, 0, width, height, 0, 0, width, height, GL_COLOR_BUFFER_BIT, GL_LINEAR); GLenum discardAllAttachments[] = {GL_COLOR_ATTACHMENT0, GL_DEPTH_ATTACHMENT, GL_STENCIL_ATTACHMENT}; glInvalidateFramebuffer(GL_READ_FRAMEBUFFER, sizeof(discardAllAttachments) / sizeof(discardAllAttachments[0]), discardAllAttachments); glBindRenderbuffer(GL_RENDERBUFFER, defaultRenderbuffer[0]); [context presentRenderbuffer:GL_RENDERBUFFER];
現在,回到主題。
Xcode 8 Instruments保留了17個工具。
相比之下,Xcode 7 Instruments裝載了19個工具。
Xcode 7 Instruments被刪除的工具分別是Automation和GPU Driver。Automation執行我們編寫的腳本並啟動在Automation分析應用列表中指定的App,這些腳本模擬了界面點擊功能。GPU Driver則從GPU驅動統計接口調用並對相應時間段的CPU占用情況進行采樣,用以分析OpenGL (ES)代碼的性能。雖然它被刪除了,但是,使用Instruments OpenGL ES Analysis時仍有GPU Driver的分析功能。
被移除的工具下面就Instruments的變更談談個人想法。
Automation對應了自動化界面邏輯測試,此次Xcode更新移除它是否會在後期給出更方便的替代品,暫未得到消息,因此令人費解。
GPU Driver的移動與Metal System Trace工具新增了tvOS和macOS對Metal的支持,暗示了蘋果將不會推出官方支持的Vulkan,因為GPU Driver的存在主要是分析OpenGL (ES)程序的性能,Metal System Trace新增說明如下圖所示。
那麼,在未來的日子裡,OpenGL ES 3.0將是iOS支持的最後一個OpenGL ES版本。對於國內多數GPU編程的小團隊而言,可能需要同時使用Xcode 7及Xcode 8,工作流依然是在Xcode 8中實現著色器邏輯,用Xcode 7 Instruments進行GPU優化,調校完iOS的著色器性能,再移植至Android端,根據相應的芯片作進一步針對性的優化。當然,對於SenseTime這類有專業GPU開發團隊的公司應該是沒什麼大影響的,因為它有資源實現Metal、Vulkan兩套代碼以便得到每個平台的最佳性能。當然,我是不會告訴你百度地圖的引擎部分也是先在iOS上調試好再往Android上搬運的,這些故事是不能隨便告訴別人的。
問題來了,既然Xcode 8的Instruments被閹割了,為何我們還要使用Xcode 8呢?原因是,Xcode 8新增了幾個實用的GPU調試功能,當然,新功能更多是方便Metal的。
此功能可用於OpenGL ES,可方便查看上傳到GPU的紋理尺寸及格式和緩沖區大小,比如1920x1080、Luminance8。
嚴格意義上說,這並非新功能,而是從Instruments OpenGL ES Analysis搬運到Xcode。
Xcode 8新增的GPU調優功能使用Xcode 8創建新項目,把老項目的代碼逐一拷貝進來,發現部分功能可在OpenGL ES程序中使用,可禁用部分GPU功能查看性能表現,如下圖所示。
禁用GPU部分功能比如,選擇最小化渲染的像素數量查看Fragment Shader對性能的影響,如下圖所示。
最小化渲染的像素數量查看GPU性能影響