Unity iOS性能优化教程与高性能实现

Unity性能优化

  • Profiler
  • 使用步骤
  • Deep Profile使用注意点
  • 工作吐槽



Profiler

Profiler是unity官方提供的检测运行效率的工具,在Unity面板中按Ctrl+7即可调出工具面板。
unity ios高性能 unity性能优化教程_功能模块


Unity提供很多种,但是我们常用的只有三种,CPU,Rendering(渲染),和Memory(内存)。

使用步骤

点击CPU模块,然后将面板属性改为Hierarchy,然后我们写上一个简单的脚本,运行测试一下。

登录后复制

public class ProfilerTest : MonoBehaviour
{
    void Update()
    {
        Test();
    }

    void Test()
    {
        Debug.Log("AAA");
    }
}

unity ios高性能 unity性能优化教程_unity ios高性能_02


在程序运行的时候,在Cpu面板中随便点击一个地方,我们发现下面的属性面板已经显示了我们脚本的性能消耗,但是并没有显示出具体的Test方法,此时我们需要勾选上Profiler面板中的Deep Profile(可以理解为深度检测),然后Reload。

unity ios高性能 unity性能优化教程_Test_03


然后我们重新运行一下。
unity ios高性能 unity性能优化教程_unity3d_04


接下来我们就发现显示了具体的Test方法,然后是Test里的Debug.log。

Deep Profile使用注意点

使用DeepProfile的时候会产生性能消耗,如果是本来就在战斗情况下,或者消耗比较大的情况,使用Deep Profile反而会起到反效果,因此我们有俩种情况去避免。
1:将想检测的功能模块单独的提取出来单独测试。
2:如果功能模块耦合比较严重,不好单独提取,我们可以使用Profiler类中提供的方法。

登录后复制


public class ProfilerTest : MonoBehaviour
{
    void Update()
    {
        Profiler.BeginSample("Current Profiler");
        Test();
        Profiler.EndSample();
    }

    void Test()
    {
        Debug.Log("AAA");
    }
}

unity ios高性能 unity性能优化教程_unity3d_05


可以看到,Profiler检测到了固定的方法性能消耗,与上面的一样开销。

工作吐槽

上家工作的时候,项目组是新开的,主程是一个工作不到两年经验的新人,还是从培训班出来的,真的是吐了,要发布版本的时候发现性能开销比较大,然后他又不会详细的去测,就只是简单的测了一下,发现是我写的脚本开销比较大,然后就让我改,然后我就用Deep Profile测出来是我调用他提供的数据保存方法造成了3MB的开销,然后我让他自己改回去。遇到这种同事时真的挺心累的,什么工作都是踢皮球,每次都要我将数据实时甩到他脸上他才愿意去做。然后!我就离职了。
v0.2版本,新增Profiler介绍

优化分为两大类:

渲染优化(GPU):

GPU优化主要是针对DrawCall这个参数,这个参数具体是什么可以自行百度,这里不做过多解释。

举个最简单的例子,复制一个1G的文件到另一个位置,与复制1024个1M的文件到另一个位置,肯定是复制1G的快。

所以DrawCall也是一样,每次调用DrawCall都可以理解为有准备工作与善后工作,我们需要做的就是讲能合并的DrawCall合并,减少准备工作与善后工作的次数。

1:层级细节LOD技术

即不同距离下渲染的物体不一样,例如近距离就渲染高精度的模型,距离远了之后渲染低精度的模型。

主要用到的组件是LOD Group。

unity ios高性能 unity性能优化教程_unity ios高性能_06


三个层级分别添加不同的模型。2:遮挡剔除

将需要渲染的游戏物体改为

unity ios高性能 unity性能优化教程_unity3d_07


在window=》Occlusion中将参数设置如下
unity ios高性能 unity性能优化教程_unity3d_08


Bake之后选中camera,即可实现优化,即只渲染在目标视野中的物体。

unity ios高性能 unity性能优化教程_unity ios高性能_09


3:光照贴图合并

具体可以参考我的这一篇文章。

灯光与渲染

4:Mesh合并
所有物体都是三点一个片面搭建出来的,最终会由MeshRender绘制出来,但是数量过多会增多DrawCall的数量,所以我们可以对Mesh进行合并,然后统一交给Mesh去渲染。

登录后复制


void MeshCombine()
    {
        MeshFilter[] filters = GetComponentsInChildren<MeshFilter>();

        CombineInstance[] combiners = new CombineInstance[filters.Length];

        for(int i = 0; i < filters.Length; i++)
        {
            combiners[i].mesh = filters[i].sharedMesh;
            combiners[i].transform = filters[i].transform.localToWorldMatrix;
        }

        Mesh finalMesh = new Mesh();
        finalMesh.CombineMeshes(combiners);

        GetComponent<MeshFilter>().sharedMesh = finalMesh;
    }
    
    

CPU优化:
对象池的应用等

               

免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空