2014年7月8日 星期二

Metal,一款相容 iOS 8 的全新圖形 API

Metal,一款相容 iOS 8 的全新圖形 API
作者: Unity - Aras Pranckevičius


iOS8上的圖形處理功能帶來了令人激動的時刻!
        WWDC(全球開發者大會)上,蘋果發佈了Metal技術,它是一款具有低消耗、高效率,並針對A7芯片進行了特殊設計的全新圖形API。採用Metal技術,遊戲開發者能充分利用iOS硬體的優點,開發的遊戲將更真實、更複雜、互動能力也更強。
Unity將很快支持Metal,在這之前我想帶你深入瞭解這新技術以及Metal技術為何如此重要。

初識Metal

Metal技術之所以能實現低消耗,更多的效能監控和更好的可編程性,是因為Metal含有如下的關鍵思想:

.盡可能地建立和驗證前期狀態
著色器可以在離線狀態下編譯和部分優化。所有與渲染(著色)通道相關的操作都可以在渲染之前就先被創建和驗證,如:著色器,頂點佈局,混合模型,渲染目標格式等。這代表在每一個drawcall中將需要更少的狀態監測,而節省大量的CPU運算

.更靈活的運用多線程技術
可以在任何線程中創建資源,並提供了好幾種方法在多線程中並行地準備drawcall的執行。

.所有的iOS設備上,CPUGPU是共享記憶體的
這就不需要將數據透過CPU從記憶體中拷貝到顯卡記憶體(這是一個很耗時的運作),只需要修改指標的指向,因為GPUCPU的內存是共享的。

.讓用戶(引擎)處理同步
OpenGL ES不得不通過大量的循環操作,來處理各式各樣的場景(事實上對於很多場景是沒有必要的)。在Metal技術中,用戶自己負責GPUCPU中數據同步,這樣引擎就可以省去大量沒有必要的操作。

.iOS設備上的GPU都是基於Tile-BasedDeferred Rendering架構
這一點明確表現在MetalAPI中,尤其是在渲染目標上。所以與緩衝區相關的操作如tile的載入與儲存,反鋸齒等都已明確地完成了,即API不在需要多餘操作。

以上幾點都意味著CPU開銷的大幅降低及性能可預見性的大幅提高
我們會為圖形和著色器引進新的基於C/C++之上的語言。這代表iOS可以進行著色器操作,原子操作,以及任意的緩衝區寫入操作等。

在這全新的設計中,Metal API非常精簡。它還有一個非常有用的”除錯,可以做很多額外的工作,並通知你程式中的所有錯誤。

關於Draw Call
如果你在製作遊戲,尤其是手機遊戲,你對draw call問題也許會很在意。每一個被繪制的物體都會有CPU開銷,現在的手機還不能繪制過多物體(大於上百個)。在遊戲中的運行邏輯,物理計算,AI運算,動畫等等都會消耗CPU。所以Unity自身採取了一些辦法來最小化draw call數量,比如靜態&動態批次處理,遮擋剔除,LOD等等。

這裡便會有一個疑問:為甚麼渲染物體時會有CPU開銷?渲染物體畢竟是GPU的工作

這其中的部分開銷來自引擎CPU需要不斷的確定可見物體,指出哪一個著色器的pass需要被渲染,哪一個光源照亮哪一個物體,指定哪一個材質參數等。其中有一些開銷是緩存操作的,有一些開銷是多線程操作,一般來說都是與發佈平台無關的代碼。每一次Unity的發佈,我們都在嘗試優化這一部分,通常情況下Metal不會對這一部分有任何影響。

CPU開銷另一方面在圖形API和驅動。不同的遊戲這一部分開銷有大有小。Metal會想辦法解決這樣的問題,來減少OpenGL ES中大量多餘的操作。預先渲染狀態的創建&驗證,渲染目標載入&儲存的顯式操作,API不同步等這三個操作都有助於降低CPU的開銷。

根據我們目前的測試,API+driver的開銷降低到只佔CPU時間的百分之幾甚至更少。和之前的15%-40%比起來差別很大。這代表大量的CPU資源可以用在我們自己的程式上面。
我們正在嘗試讓Metal進行多線程繪制,當然對於我們而言,這也是一個非常有意思的優化機會。

Compute Shader(新的著色器)
有了MetalGPU可以在典型的Vertex+Fragment Shader外面進行計算(被稱為”Compute Shader”).大致上講,能在GPU中的許多小型處理器上進行各種類型的並行計算Compute Shader有一個局部存儲器的概念——CPU上一塊執行效率非常高的記憶體,在並行操作時,用來共享數據。這塊特殊的內存使GPU可以更加容易顯示一些舊的VertexFragment Shader不易於顯示的效果。
Compute Shader可用來做很多有趣的事情:優化後處理效果,粒子系統,陰影和光線剔除等
雖然目前在Unity中還沒有大量地使用Compute Shader,但我們正在嘗試將它用在越來越多的地方,值得期待!

常見問題
甚麼時候能使用到Metal
我們已經迫不及待想要發佈它,但是目前還無法確定具體的日期。我們已經做了大量的工作,但還有很多方面需要完善。當前重要的是完全整合Metal,以此大幅度提升CPU方面的性能。我們希望在之後的Unity5.0版本對Compute Shader的支援(在我們內部Compute Shader已經某種程度上支援了)

對平台有甚麼樣的要求?
iOS8和含有A7芯片的設備(iPhone 5s, iPadAir, Retina iPad Mini).

我該如何利用好Metal技術中的CPU低消耗的優勢?
簡單說不需要做任何事情。一旦Unity中支持Metal技術,它的使用將會非常地自動化。所有你現有的項目,著色器和圖形特效都應該可以一如既往地工作。

因為Metal技術有不同的程序語言,那著色器會不一樣嗎?
我們會處理這個問題的,現在你用Cg/HLSHshaderUnity自動將其轉化為GLSL。對於Metal,我們也會進行相類似的做法。

再問一次,在低CPU開銷下,我能做甚麼?

更好的物理效果,AI和更複雜的遊戲邏輯。在螢幕上顯示更多的內容,或者節省更多電量。這一切都取決於你!

沒有留言:

張貼留言

著作人