Unity3D游戏优化的一些方法(静态动态)

    • 静态优化
    • 动态优化

本文是根据泰课视频《Unity3D开发技术讲解》的部分学习整理。

静态优化

  • 静态物体勾选static
  • 贴图处理(属性设置)
    • TextureType选择Advanced
    • 移动设备下设置贴图压缩格式
      • Android原生支持ETC,OPNEGL2.0都支持。ETC2只有OPENGL3.0支持;
      • IOS只支持PVRTC的压缩格式
    • Generate Mip Maps:根据我们的视距采用不同的贴图,小图不勾选。
  • 模型处理
    • 顶点数量越少越好,控制面片数
    • 静态模型删除无效的Animator(从3DMax、Maya导出可能附带多余的Animator)

动态优化

此动态优化针对一些类似游戏内的动态装饰品对象。代码动态实例化的对象不适用此方法!

对于成批的相同物件、骨骼一致、材质一致的对象,组合渲染,减少Draw Call。

新建空对象作为父节点,统一管理成批物件。空对象添加脚本CombineOpMesh.cs

using UnityEngine;
using System.Collections.Generic;

/// 
/// 动态优化Unity:组合渲染,减少Draw Call
/// 
public class CombineOpMesh : MonoBehaviour
{
    void Start()
    {
        CombineToMesh(gameObject);
    }

    public void CombineToMesh(GameObject _go)
    {
        SkinnedMeshRenderer[] smr = _go.GetComponentsInChildren();
        List Icom = new List();

        List Imat = new List();
        List Itra = new List();

        for (int i = 0; i < smr.Length; i++)
        {
            Imat.AddRange(smr[i].materials);
            Itra.AddRange(smr[i].bones);

            for (int sub = 0; sub < smr[i].sharedMesh.subMeshCount; sub++)
            {
                CombineInstance ci = new CombineInstance();
                ci.mesh = smr[i].sharedMesh;
                ci.subMeshIndex = sub;
                Icom.Add(ci);
            }
            Destroy(smr[i].gameObject);
        }

        SkinnedMeshRenderer _r = _go.GetComponent();
        if (_r == null)
            _r = _go.AddComponent();

        _r.sharedMesh = new Mesh();
        _r.bones = Itra.ToArray();
        _r.materials = new Material[] { Imat[0] };
        _r.rootBone = _go.transform;
        _r.sharedMesh.CombineMeshes(Icom.ToArray(), true, false);
    }
}

你可能感兴趣的:(Unity)