在wwdc(全球開發者大會)上,蘋果發布了metal技術。它是一款全新的圖形api,具有低開銷、高效率,並針對a7晶元進行了特殊的設計。基於metal技術,遊戲開發者能充分利用ios硬體的優點,開發的遊戲將更加真實、更多細節、互動性也更強。
metal技術之所以能實現低消耗、更多的效能可預見性和更好的可程式設計性,是因為metal中含有如下的關鍵思想:
著色器可以在離線狀態下編譯和部分優化。所有與渲染管線狀態相關的操作都可以先於渲染甚至是開始時被建立和驗證,如:著色器,頂點布局,混合模型,渲染目標格式等。這就意味著在每乙個drawcall中只需要更少的狀態監測,從而節省了大量的cpu。
可以在任何執行緒中建立資源,並提供了好幾種方法在多執行緒中並行地準備drawcall的提交。
這就不需要將資料從cpu(記憶體)中拷貝到gpu(視訊記憶體)中(這是乙個很耗時的操作),只需要修改指標的指向,因為gpu和cpu的記憶體是共享的。
opengl es不得不通過大量的迴圈操作,來處理各種各樣的場景(事實上,對於很多具體的場景,是沒有必要的)。在metal技術中,使用者自己負責gpu和cpu中資料同步,這樣引擎就可以省去大量的沒必要的操作。
·ios裝置上的gpu都是基於tile-baseddeferred rendering架構
這一點明確體現在metal的api中,尤其是在渲染目標上。所以與緩衝區相關的操作如tile的載入與儲存,反鋸齒等都已明確地完成了,即api不在需要多餘操作。
以上幾點都意味著cpu開銷的大幅降低以及效能可預見性的大幅提高
為圖形和著色器引進了新的基於c/c++之上的語言。這就意味著ios可以進行著色器操作,原子操作,以及任意的緩衝區寫入操作等。
在這全新的設計中,metalapi非常精簡。它還有乙個超級有用的可選「除錯層」,可以做很多額外的工作,並通知你程式設計中的所有錯誤。
關於draw call
如果你在製作遊戲,尤其是手機遊戲,你對draw call問題也許會很在意。每乙個被繪製的物體都會有cpu開銷,對於當下的手機,不能繪製過多物體(大於上百個)。顯然,在遊戲中,遊戲執行邏輯,物理計算,人工智慧運算,動畫等等都會消耗cpu。所以unity自身採取了一些辦法來最小化draw call的數量,如靜態&動態批處理,遮擋剔除,採用紋理集來減少材質的數量等。
為什麼渲染物體時會有cpu開銷,畢竟渲染物體是gpu做的事情。
這其中,部分開銷來自於「引擎」方面,cpu需要迭代地確定可見物體,指出哪乙個著色器的pass需要被渲染,哪乙個光源照亮哪乙個物體,指定哪乙個材質引數等。其中有一些開銷是快取操作的,有一些開銷是多執行緒操作,一般來說都是與平台無關的**。每一次unity的發布,我們都在嘗試優化這一部分,通常情況下metal不會對這一部分有任何影響。
cpu開銷的另一方面在「圖形api和驅動」。對於不同的遊戲,這一部分開銷可能會很大。metal嘗試著通過更好地匹配硬體,來減少opengles中的大量多餘的操作,進而來去掉這部分開銷。預先渲染狀態的建立&驗證;渲染目標載入&儲存的顯式操作;api方面無同步操作——這三個操作都有助於降低cpu的開銷。
根據我們目前的測試,api+driver的開銷降低到只佔cpu時間的幾個百分點公升甚至更少。和之前的15%-40%比起來,則是相當顯著的提高。這就意味著大量的cpu資源可以用在我們自己的**上面。
我們正在嘗試讓metal進行多執行緒繪製,當然對於我們而言,這也是乙個非常有意思的優化機會。
compute shader(新的著色器)
有了metal,gpu可以在典型的vertex+fragment shader外面進行計算(被稱為「compute shader」).大致上講,能在gpu中的許多小型處理器上進行各種型別的「平行計算」。compute shader有乙個「區域性儲存器」的概念——cpu上一塊執行效率非常高的記憶體,在並行操作時,用來共享資料。這塊特殊的記憶體使gpu可以更加容易顯示一些舊的vertex和fragment shader不易於顯示的效果。
compute shader可用來做很多有趣的事情:優化後處理效果,粒子系統,陰影和光線剔除等
相關文件:
direct3d, opengl, metal, full circle
iOS8 學習新技術
1.了解有什麼新技術 1 蘋果api 文件 general guides iosx api diffs 2 wwdc 2.如何使用新技術 1 自己根據 api文件嘗試新的類和新的方法 2 iosx開發3 蘋果api 文件 samplecode 比如 cocoa touch layer uikit 4...
IOS開發技術問題總結(五)
nstimer timer nstimer scheduledtimerwithtimeinterval 多少秒觸發一次 target 要觸發的函式所在的物件 selector selector 要觸發的函式的名字 userinfo 要傳遞給函式的引數 repeats 是否反覆觸發 timer st...
iOS中 加強日誌輸出 開發技術總結
對於那些做後端開發的工程師來說,看log解bug應該是理所當然的事,但我接觸到的移動應用開發的工程師裡面,很多人並沒有這個意識,查bug時總是一遍一遍的試圖重現,試圖除錯,特別是對一些不太容易重現的bug經常焦頭爛額。而且ios的異常機制比較複雜,objective c的語言駕馭也需要一定的功力,做...