Unity網格變形開源庫測評

【博物納新】是UWA旨在爲開發者推薦新穎、易用、有趣的開源項目,幫助你們在項目研發之餘發現世界上的熱門項目、前沿技術或者使人驚歎的視覺效果,並探索將其應用到本身項目的可行性。不少時候,咱們並不知道本身想要什麼,直到某一天咱們遇到了它。html

更多精彩內容請關注:lab.uwa4d.com算法


簡介

Deform是一個Unity的網格變形工具框架,使用JoySystem+Burst編譯器工做,在CPU端得到更好的性能。它擁有便捷易用的Editor工具,可實現包括Blend、Twist等內置的40多種變形效果,固然也支持用戶本身編寫的Custom Deformer。框架

如下爲部分效果圖:
請輸入圖片描述
請輸入圖片描述
請輸入圖片描述編輯器

每一種類型的變形效果稱爲Deformer,而接收變形效果的網格物體稱爲Deformable。在每一類Deformer中會把計算量較大的頂點位置計算邏輯定位爲IJobParallelFor類型的Job。模塊化

如下爲預製的膨脹變形器BulgeDeformer中定義的網格頂點位置算法:工具

[BurstCompile(CompileSynchronously = COMPILE_SYNCHRONOUSLY)]
public struct BulgeJob : IJobParallelFor
{
    public float factor;
    public float top;
    public float bottom;
    public bool smooth;
    public float4x4 meshToAxis;
    public float4x4 axisToMesh;
    public NativeArray<float3> vertices;

    public void Execute(int index)
    {
        var point = mul(meshToAxis, float4(vertices[index], 1f));

        var normalizedDistanceBetweenBounds = (clamp(point.z, bottom, top) - bottom) / (top - bottom);
        if (smooth)
            normalizedDistanceBetweenBounds = smoothstep(0f, 1f, normalizedDistanceBetweenBounds);
        var signedDistanceBetweenBounds = (normalizedDistanceBetweenBounds - 0.5f) * 2f;

        point.xy *= signedDistanceBetweenBounds * signedDistanceBetweenBounds * -factor + factor + 1f;

        vertices[index] = mul(axisToMesh, point).xyz;
    }
}

其在運行時在Timeline中查看Job Thread上的運行狀況以下:
請輸入圖片描述性能

在運行時,全部須要應用變形的網格Deformables由一個DeformableManager管理,控制每個網格的準備工做、變形計算、等待完成。再由每一個Deformable安排其上Deformer的Job進行工做,以實現較好的性能。測試

開源庫連接:https://lab.uwa4d.com/lab/5cabb5ad72745c25a82d8d64spa


使用說明

首先,你須要一個2018.3+的Unity版本,而後按照開源庫中的安裝說明安裝一下便可。線程

打開Unity編輯器,能夠在菜單欄中找到Tools -> Deform -> Creator Window,打開編輯面板。

點擊【Create Deformable】便可快速建立一個約3000面的Deformable了。
請輸入圖片描述

接下來選中Deformable Object,點擊Create Window面板中想要添加的預製Deformer,便可自動完成添加,這裏選擇一個Bulge類型的Deformer以下圖:
請輸入圖片描述

而後只要修改Bulge Deformer的參數便可看到網格變形的效果了。
請輸入圖片描述

此外,Deformer還支持將變形後的網格保存成資源。
請輸入圖片描述


性能測評

本期的性能測評使用UWA GOT Online在小米8和三星S6兩個中高端設備上進行了同屏壓力測試。經過添加不一樣個數的Bulge Deformer的Deformable GameObject比較性能差別。測試用例的截圖以下:
請輸入圖片描述

獲得在兩個設備上的FPS幀率信息以下:

在小米8上Deformable從1個添加到45個,幀率一直穩定在59幀左右:

而在三星S6上,當Deformable達到30個時開始掉幀,最終在Deformable添加到45個時掉到了27幀左右。

在CPU耗時方面,主線程的耗時主要集中在DeformableManager.Update上,統計獲得其耗時均值與Deformable個數的關係以下:

同時,因爲Deform應用的變形效果每個網格都是一個實例,因此在內存中也會有一樣多份的網格資源,這也是你們在使用時須要注意的:


總結

正如做者在Release說明中提到的:

"Deform runs on the CPU. While it is incredibly fast, you should not expect to get performance comparable to vertex shaders.
Use shaders if you need speed, use Deform if you need modularity and ease-of-use."

使用CPU端來實現網格變形效率上必然比不上Vertex Shader,但若是但願有一個模塊化易用性高的工具,Deform的確是一個不錯的選擇。


快用UWA Lab合輯Mark好項目!
請輸入圖片描述

今天的推薦就到這兒啦,或者它可直接使用,或者它須要您的潤色,或者它啓發了您的思路......

請不要吝嗇您的點贊和轉發,讓咱們知道咱們在作對的事。固然若是您能夠留言給出寶貴的意見,咱們會越作越好。

相關文章
相關標籤/搜索