2014年7月15日 星期二

Unity 5值得期待的高性能物理元件


Unity 5中值得期待的高性能物理元件
作者 - Unity - Anthony

Unity採用PhysX2.8.3物理引擎已經有一段很長的時間了,當然我們不是單單使用PhysX,多年來由Unity的工程師開發了各種補丁不斷強化它,真心感謝這麼好的引擎帶給我們的開發體驗。在今年的GDC我們也宣布Unity5會將PhysX升級到3.3,現在就讓我們進一步來瞭解。

PhysX SDK 3是架構在原本PhysX SDK 2.x 的基礎上重新設計。基本上,PhysX的開發團隊將2.x好的創意及功能保留下來,並重新編寫了SDK。這代表SDK的程式構架是全新的,介面也是全新的,同時絕大多數功能也是全新的。

現在我們來了解一下Unity 5.0的物理元件。

首先我們從簡單的功能開始介紹。我們將PhysX的適應力設定(Adaptive Force)做成可切換的,在預設狀態是關閉的。Adaptive Force是PhysX所使用的一項特殊技術,主要用於修正PhysX在類比動態狀況時不可避免的數值偏差。

移動靜態碰撞體(Moving Static Colliders)
靜態碰撞體的移動操作所帶來開銷將會大大降低。靜態碰撞體只是附有碰撞體元件的遊戲物件(GameObject),並沒有剛體(Rigidbody)元件。在以往因為SDK假設靜態碰撞體均是靜止的,所以移動一個靜態碰撞體會觸發重建耗效能的AABB 樹狀結構,進而讓整體效率大打折扣。

但在Unity 5中,我們使用相同的資料結構來同時處理動態與靜態碰撞體的移動。可惜的是,換來的代價是會失去靜態碰撞體耗用記憶體比動態碰撞體少的優點,但是會有這項改變是因為靜態碰撞體的移動消耗是目前最影響Unity專案性能的三大主要原因之一。因此我們必須進行修改和優化。


碰撞檢測(Collision detection)
連續式的碰撞檢測效率在新版本有了大幅度的提升。這個功能主要用於防止移動速度過快的物體在碰撞檢測之前就穿過物體的情況。比如,一枚高速飛行的子彈穿過一張紙,或者在撞球檯中,速度飛快的撞球和其他球或桌邊發生碰撞等等。

在Unity 5.0當中,SDK會產生用於處理快速運動的資料,你只需在編輯器中直接打開連續碰撞檢查(continuous collision detection)即可。PhysX3採用的演算法還可以根據物體的速度來判斷是否真的需要使用消耗很大的CCD模擬,或是進行預設的連續式碰撞就可以做得很好。這功能在你開啟CCD時就會被自動啟動。





Broadphase上的剛體
PhysX3在broadphase上支持更多剛體。事實上,在PC平台上的遊戲每Frame可以支援幾十萬個剛體。在以前PhysX最多只支持6萬4千個剛體,這並不是一個能夠輕易提高的數量,想要提高這個常量必須得在SDK上節省更多空間才行。但對於一些像PS3這樣的遊戲機而言,他們仍然必須有這樣的限制。同時物理材質也有限制:在發表這篇文章之際,你仍然無法在任何平臺上使用超過64k數量的材質。

縮放網格碰撞體(Mesh Colliders)耗用低
在Unity 5.0之中,我們降低了網格碰撞體的縮放消耗。在以往當你縮放一個網格碰撞體時,你得重新產生一個縮放的網格。而這過程會佔用時間和記憶體。而PhysX3支援直接在原有網格上進行縮放,這種縮放基本上是不耗效能的的。

接下來,我們來看看與Unity4.x版本完全不同全新的兩個系統:布料與車輛模組。

布料元件(Cloth component)
我們先來看布料元件。在Unity4時,布料模擬是透過InteractiveCloth與SkinnedCloth兩個元件來執行的。InteractiveCloth元件擁有像布料一樣的網格呈現,可對其施力等特點讓它成為能與其他物理物件互動的“物理布料”。但是InteractiveCloth元件計算非常耗效能,所以Unity 4 針對角色衣物的布料模擬又設計了SkinnedCloth元件。

因為SkinnedCloth並不佔用模擬運算的管道,所以效能要優於InteractiveCloth元件。但布料元件最大的問題是兩個元件的模擬效果都不穩定,且運算效能耗用高。所以我們在整合PhysX3的同時決定不再支援InteractiveCloth元件,取而代之的是一個整體以設計角色衣物為主的布料元件,Cloth。

在Unity 5.0裡,布料不再與場景裡的碰撞體進行互動,也不再產生反作用力。取而代之的是一個更快、多緒、更穩定的角色布料模擬系統。當你使用全新的布料元件時,它不再對任何物體進行反應。

布料與外部世界不再相互作用,除非你手動將碰撞體加到布料元件上。要注意的是,就算你手動加入碰撞體,布料模擬過程仍然是單向的,布料會對其他碰撞體做出反應,但並不會施加反作用力。且你只能對布料元件加入三種碰撞體,球形(sphere)、膠囊(capsule),和由兩個球體組成的圓錐形碰撞體。這些改變都是為了提升執行性能及表現。

Unity 5.0中的布料模擬介面與目前的SkinnedCloth介面類似,但我們正積極的調整讓它能在5.x的時候整個操作像是整合到Mecanim系統裡。

全新的布料元件可以通過CUDA從內部支援GPU。但因為一些因素我們決定在之後的5.x版才加入這個功能。這是因為CUDA只能在Windows系統下的NVIDIA硬體上執行,但我們的開發者有很大一部分都在使用Mac和Linux。再者我們希望能先集中火力解決核心問題,之後再加入這種酷炫的元件。

全新的VehicleSDK
現在,我們來簡單介紹一下新版本的車輛模擬功能。PhysX3引用了全新的Vehicle SDK來取代之前一直在使用的WheelCollider元件。這個元件可以實現更具真實感的懸架距離和車胎摩擦力效果。另外還解決了一些存在已久的問題。

當然如果開發者們希望找到已經過精細調整、效果更真實或更高階的插件,那我們建議可以直接去Asset Store上找,比如Edy’s Vehicle Package。

來看看我們從網上下載的免費模型並花點時間做出的成果


底下這是一個Edy’s Vehicle Package中專門針對SUV的效果。

Edy 目前正在開發包含更多酷炫效果的資源包。儘管我們想向大家分享所有有關車輛模擬的技術細節,但今天還是先讓我們來看一下全新的WheelCollider示意圖,展示汽車懸架變數是如何工作的。



在上圖中輪圈和車輪直徑被標記為綠色,而懸掛的軌跡被標記橙色,施力點範圍也用綠色球體標出。在懸掛的軌跡部分上,標出了最大壓縮位置、最大下降位置,與目標位置。

正如你看到的,輪胎只能在最大壓縮位置與最大下降位置之間移動。而目標位置(也稱平衡位置)位於通過彈簧彈力得到平衡的彈簧重量上受彈力保持平衡的位置,比如當車輛靜止在水平面上時的輪胎位置。雖然校準看起來很難,但實際上最大壓縮位置就是你輪胎一開始在網格中所處的位置。

接下來,你可以指定懸掛距離和目標位置作為懸掛距離的一小部分。它們只是兩個浮點數,簡單吧!跟你說,新的車輪圖示會從模擬資料更新旋轉和位置數據,你在也不用為了定位寫程式。因為這一切都已經內建於引擎中。

效能(Performance)
我們將會支援多核心透過多工的方式來運算PhysX3,這樣我們可以在不同的核心執行不同的任務。SDK會用多執行緒來執行,並處理好所有的關係和工作分配。

到目前為止我們合理預期,有了更好的程式庫和多執行緒之後,未來的引擎效能可以倍增。在某些案例中,改進效果令人驚訝,性能提升甚至達到了十倍以上。

對效能感興趣的開發人員,可以訪問Pierre Terdiman的部落格。他是PhysX SDK的主要研發人員。

相容性(Compatibility)
新的功能外觀與使用體驗都會延續了Unity一貫的風格,但在特定情況下,或許有些舊的使用方法將不再被Unity 5所支援,即Unity 5.0的物理元件並不一定100%與Unity 4.x相容。在你將舊專案更新到Unity 5時,可能要重新檢視所有跟物理相關的程式碼。

除了今天說的這些以外,Unity 5的物理元件還有很多功能。可以到Unity 官方論壇留言。如果你會參加2014年的Unite開發者大會,我在大會會有關於Unity 5.0物理元件深度訪談的發言,記得過來跟我們打聲招呼並和我們聊兩句吧!

更多關於Unity 5的資料(英文)



沒有留言:

張貼留言

關於我自己

我的相片
Unity台灣官方部落格 請上Facebook搜尋Unity Taiwan取得Unity中文的最新資訊