本系列文章是對 metalkit.org 上面MetalKit內容的全面翻譯和學習.html
幾周前,在WWDC2016
,Apple
工程師發佈了一份新的文檔,Metal Best Practices Guide Metal最佳實踐指南,它包含了很是有用的信息,關於如何在你的Metal
應用中組織代碼來得到更好的性能.由於文檔是很是全面普遍的,咱們在本文中將只列出主要的概念.一個高效的Metal
應用須要:性能優化
CPU
佔用.GPU
性能.最佳實踐:儘早建立持久對象並重用它們.併發
Metal
框架提供了幾個協議來管理那些貫穿你的應用整個生命週期的持久對象.這些對象建立花費很大但一般初始化一次並常常重用.不要在每一個渲染循環或計算循環開始時建立這些對象.app
最佳實踐:爲你的資源設置合理的儲存模式和紋理使用設置.框架
Metal
資源必須被合理配置來充份利用調整內存訪問和驅動器性能優化.資源儲存模式容許你爲MTLBuffer
和MTLTexture
對象自定義儲存位置和訪問權限.紋理使用設置容許明確聲明你想要如何使用你的MTLTexture
對象.異步
iOS
和tvOS
)OS X
)要了解更多信息,查閱文檔的資源設置章節Resource Optionside
最佳實踐:實現三重緩衝器來更新動態緩衝器數據. 動態緩衝器數據指緩衝器內儲存的常常更新的數據.強烈推薦實現一個三重緩衝器模型,來避免每幀建立新的緩衝器及最小化幀間處理器閒置時間.函數
要了解更多信息,查閱文檔的三重緩衝器章節 Triple Buffering佈局
最佳實踐:用合理的方法來綁定你的緩衝器數據到圖形或計算函數. Metal
提供了若干API
設置來綁定緩衝器數據到圖形或計算函數.setVertexBytes:length:atIndex: 方法是最佳選項來綁定大量小於 4KB 的動態緩衝器數據(瞬時緩衝器)到頂點函數.若是數據大於4KB,你應該一次性建立一個MTLBuffer並在須要時更新它的內容.
要了解更多信息,查閱文檔的緩衝器綁定章節 Buffer Bindings
最佳實踐:儘量短暫的持有可繪製對象. 命令緩衝器在本身被調度執行以前,能夠經過presentDrawable方法來調度drawable的顯示,可是,實際上drawable本身是在命令緩衝器被執行完才顯示的.
要了解更多信息,查閱文檔的可繪製對象章節Drawables section of the documentation.
最佳實踐:以目標顯示屏的精確像素尺寸來渲染. 你的drawable的像素尺寸應該老是匹配目標顯示屏的精確像素尺寸.這樣能夠避免離屏像素渲染,或引起額外的採樣處理.
要了解更多信息,查閱文檔的原生屏幕比例章節 Native Screen Scal
最佳實踐:對於那些不能維持60 FPS幀率的應用,以一個穩定的幀率顯示你的drawable. iOS
設務的屏幕刷新率是60 Hz
.不能穩定在這段時間內完成幀渲染的應用,應該設置更低的幀率來避免卡頓.tvOS
的屏幕刷新率通常是60 Hz
,但並不固定.
要了解更多信息,查閱文檔的幀率章節Frame Rate
最佳實踐:爲你的渲染目標設置合理的加載與儲存動做. 在你的Metal
渲染對象上執行的動做必須被合理配置,來避免在渲染過程的開始()或xf昂貴或沒必要要的渲染工做.
要了解更多信息,查閱文檔的加載與儲存動做章節Load and Store Actions
最佳實踐:儘量的合併渲染命令編碼器. 消除沒必要要的渲染命令編碼器,減小內存帶寬佔用並提升性能.
要了解更多信息,查閱文檔的渲染命令編碼器章節Render Command Encoders
最佳實踐:每幀提交儘量少的命令緩衝器,充份利用GPU
. 命令緩衝器在Metal
中是提交工做的基本單位;它們由CPU
建立並被GPU
執行.這種關係容許你經過調整每幀提交的命令緩衝器數量來平衡CPU
和GPU
的工做.
要了解更多信息,查閱文檔的命令緩衝器章節Command Buffers
最佳實踐:若是你的繪製或調度調用參數是由GPU
動態生成的,應使用間接緩衝器. 間接緩衝器是MTLBuffer
對象,它帶有一個特殊的數據佈局來表明繪製或調度命令參數.
要了解更多信息,查閱文檔的命令緩衝器章節Indirect Buffers
最佳實踐:在build生成時編譯你的函數,並生成你的庫. 編譯Metal Shading Language
源代碼是Metal
應用中耗時的階段之一.Metal
經過容許你在build時編譯圖形和計算函數並在運行時做爲庫加載它們,來縮短期花費.
要了解更多信息,查閱文檔的函數和庫章節 Functions and Libraries
最佳實踐:異步build生成你的渲染和計算管線. 擁有多個渲染或計算管線容許你爲特定任務使用不一樣的狀態配置.異步生成這些管線能夠提升性能和併發數.推薦你提早生成全部已知的管線,避免懶加載.
要了解更多信息,查閱文檔的管線章節Pipelines
這份指南,還有Metal編程指南 Metal Programming Guide及Metal着色語言指南Metal Shading Language Guide都已經更新到iOS 10
, tvOS 10
和OS X 10.12
,它們三部文檔包含了建立高性能Metal
應用所需的一切.