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好项目!
请输入图片描述

今天的推荐就到这儿啦,或者它可直接使用,或者它须要您的润色,或者它启发了您的思路......

请不要吝啬您的点赞和转发,让咱们知道咱们在作对的事。固然若是您能够留言给出宝贵的意见,咱们会越作越好。

相关文章
相关标签/搜索