[MetalKit]23-Using-MetalKit-part-16使用MetalKit16

本系列文章是對 metalkit.org 上面MetalKit內容的全面翻譯和學習.html

MetalKit系統文章目錄編程


幾周前,在WWDC2016,Apple工程師發佈了一份新的文檔,Metal Best Practices Guide Metal最佳實踐指南,它包含了很是有用的信息,關於如何在你的Metal應用中組織代碼來得到更好的性能.由於文檔是很是全面普遍的,咱們在本文中將只列出主要的概念.一個高效的Metal應用須要:性能優化

  • CPU佔用.
  • 最佳的GPU性能.
  • 連續的處理器並行計算.
  • 高效資源管理.

1 Resource Management 資源管理

1.1 Persistent Objects持久對象

最佳實踐:儘早建立持久對象並重用它們.併發

Metal框架提供了幾個協議來管理那些貫穿你的應用整個生命週期的持久對象.這些對象建立花費很大但一般初始化一次並常常重用.不要在每一個渲染循環或計算循環開始時建立這些對象.app

  • 先初始化你的Device和Command Queue命令隊列
  • 在Build Time建立時間就編譯你的函數和庫
  • 創建Pipelines管線一次並重用它們
  • 預告分配資源儲存空間 要了解更多信息,查閱文檔的持久對象章節Persistent Objects

1.2 Resource Options資源設置

最佳實踐:爲你的資源設置合理的儲存模式和紋理使用設置.框架

Metal資源必須被合理配置來充份利用調整內存訪問和驅動器性能優化.資源儲存模式容許你爲MTLBufferMTLTexture對象自定義儲存位置和訪問權限.紋理使用設置容許明確聲明你想要如何使用你的MTLTexture對象.異步

  • 熟悉設備內存模式
  • 選擇合理的資源儲存模式(iOStvOS)
  • 選擇合理的資源儲存模式(OS X)
  • 設置合理的紋理使用標誌

要了解更多信息,查閱文檔的資源設置章節Resource Optionside

1.3 Triple Buffering三重緩衝器

最佳實踐:實現三重緩衝器來更新動態緩衝器數據. 動態緩衝器數據指緩衝器內儲存的常常更新的數據.強烈推薦實現一個三重緩衝器模型,來避免每幀建立新的緩衝器及最小化幀間處理器閒置時間.函數

  • 防止訪問衝突,減小處理器閒置時間
  • 減小內存開銷和幀延遲
  • 容許命令緩衝事務時間
  • 實現三重緩衝器模型

要了解更多信息,查閱文檔的三重緩衝器章節 Triple Buffering佈局

1.4 Buffer Bindings緩衝器綁定

最佳實踐:用合理的方法來綁定你的緩衝器數據到圖形或計算函數. Metal提供了若干API設置來綁定緩衝器數據到圖形或計算函數.setVertexBytes:length:atIndex: 方法是最佳選項來綁定大量小於 4KB 的動態緩衝器數據(瞬時緩衝器)到頂點函數.若是數據大於4KB,你應該一次性建立一個MTLBuffer並在須要時更新它的內容.

要了解更多信息,查閱文檔的緩衝器綁定章節 Buffer Bindings

Display Management顯示管理

2.1 Drawables可繪製對象

最佳實踐:儘量短暫的持有可繪製對象. 命令緩衝器在本身被調度執行以前,能夠經過presentDrawable方法來調度drawable的顯示,可是,實際上drawable本身是在命令緩衝器被執行完才顯示的.

  • 用MetalKit View來獲取Drawable

要了解更多信息,查閱文檔的可繪製對象章節Drawables section of the documentation.

2.2 Native Screen Scale (iOS and tvOS)原生屏幕比例

最佳實踐:以目標顯示屏的精確像素尺寸來渲染. 你的drawable的像素尺寸應該老是匹配目標顯示屏的精確像素尺寸.這樣能夠避免離屏像素渲染,或引起額外的採樣處理.

  • 用MetalKit View來支持原生屏幕比例

要了解更多信息,查閱文檔的原生屏幕比例章節 Native Screen Scal

2.3 Frame Rate (iOS and tvOS)幀率

最佳實踐:對於那些不能維持60 FPS幀率的應用,以一個穩定的幀率顯示你的drawable. iOS設務的屏幕刷新率是60 Hz.不能穩定在這段時間內完成幀渲染的應用,應該設置更低的幀率來避免卡頓.tvOS的屏幕刷新率通常是60 Hz,但並不固定.

  • 用MetalKit View來支持原生屏幕比例

要了解更多信息,查閱文檔的幀率章節Frame Rate

3 Command Generation命令生成

3.1 Load and Store Actions加載與儲存動做

最佳實踐:爲你的渲染目標設置合理的加載與儲存動做. 在你的Metal渲染對象上執行的動做必須被合理配置,來避免在渲染過程的開始()或xf昂貴或沒必要要的渲染工做.

  • 選擇合理的加載動做
  • 選擇合理的儲存動做
  • 在渲染過程當中評估動做

要了解更多信息,查閱文檔的加載與儲存動做章節Load and Store Actions

3.2 Render Command Encoders (iOS and tvOS)渲染命令編碼器

最佳實踐:儘量的合併渲染命令編碼器. 消除沒必要要的渲染命令編碼器,減小內存帶寬佔用並提升性能.

  • 評估渲染傳遞順序
  • 評估採樣依賴
  • 評估渲染過程當中的動做

要了解更多信息,查閱文檔的渲染命令編碼器章節Render Command Encoders

3.3 Command Buffers命令緩衝器

最佳實踐:每幀提交儘量少的命令緩衝器,充份利用GPU. 命令緩衝器在Metal中是提交工做的基本單位;它們由CPU建立並被GPU執行.這種關係容許你經過調整每幀提交的命令緩衝器數量來平衡CPUGPU的工做.

要了解更多信息,查閱文檔的命令緩衝器章節Command Buffers

3.4 Indirect Buffers間接緩衝器

最佳實踐:若是你的繪製或調度調用參數是由GPU動態生成的,應使用間接緩衝器. 間接緩衝器是MTLBuffer對象,它帶有一個特殊的數據佈局來表明繪製或調度命令參數.

  • 消除沒必要要的數據傳輸並減小處理器閒置時間

要了解更多信息,查閱文檔的命令緩衝器章節Indirect Buffers

4 Compilation

4.1 Functions and Libraries函數和庫

最佳實踐:在build生成時編譯你的函數,並生成你的庫. 編譯Metal Shading Language源代碼是Metal應用中耗時的階段之一.Metal經過容許你在build時編譯圖形和計算函數並在運行時做爲庫加載它們,來縮短期花費.

  • 在build時生成你的庫
  • 將函數放在一個單一的庫裏面

要了解更多信息,查閱文檔的函數和庫章節 Functions and Libraries

4.2 Pipelines管線

最佳實踐:異步build生成你的渲染和計算管線. 擁有多個渲染或計算管線容許你爲特定任務使用不一樣的狀態配置.異步生成這些管線能夠提升性能和併發數.推薦你提早生成全部已知的管線,避免懶加載.

要了解更多信息,查閱文檔的管線章節Pipelines

這份指南,還有Metal編程指南 Metal Programming Guide及Metal着色語言指南Metal Shading Language Guide都已經更新到iOS 10, tvOS 10OS X 10.12,它們三部文檔包含了建立高性能Metal應用所需的一切.

相關文章
相關標籤/搜索