Unity3D静态对象优化系列二-创新互联

   在系列一中,我们已经知道了问题所在,一个是优化后我们模型位置改变了,另一个是如果是不同的材质的物体一起优化的时候,不同的材质的对象会消失掉,我们在系列二中主要是解决这两个问题:

创新互联建站是一家集网站建设,三沙企业网站建设,三沙品牌网站建设,网站定制,三沙网站建设报价,网络营销,网络优化,三沙网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。

  接下来我们改进的思路是查找所有的MeshFilter,同时我们根据不同的材质对我们需要优化的对象进行分离。这就需要我们定义两个链表:

        ArrayList materials = new ArrayList();         ArrayList combineInstanceArrays = new ArrayList();

下面我们开始遍历我们需要优化对象的MeshFilter和MeshRenderer,因为材质是与MeshRenderder相关联的代码如下:

        foreach (GameObject obj in Objects)         {             if (!obj)                 continue;             MeshFilter[] meshFilters = obj.GetComponentsInChildren();             foreach (MeshFilter meshFilter in meshFilters)             {                 MeshRenderer meshRenderer = meshFilter.GetComponent();                 if (!meshRenderer)                 {                     Debug.LogError("MeshFilter does not have a coresponding MeshRenderer.");                     continue;                 }                 if (meshRenderer.materials.Length != meshFilter.sharedMesh.subMeshCount)                 {                     Debug.LogError("Mismatch between material count and submesh count. Is this the correct MeshRenderer?");                     continue;                 }                 for (int s = 0; s < meshFilter.sharedMesh.subMeshCount; s++)                 {                     int materialArrayIndex = 0;                     for (materialArrayIndex = 0; materialArrayIndex < materials.Count; materialArrayIndex++)                     {                         if (materials[materialArrayIndex] == meshRenderer.sharedMaterials[s])                             break;                     }                     if (materialArrayIndex == materials.Count)                     {                         materials.Add(meshRenderer.sharedMaterials[s]);                         combineInstanceArrays.Add(new ArrayList());                     }                     CombineInstance combineInstance = new CombineInstance();                     combineInstance.transform = meshRenderer.transform.localToWorldMatrix;                     combineInstance.subMeshIndex = s;                     combineInstance.mesh = meshFilter.sharedMesh;                     (combineInstanceArrays[materialArrayIndex] as ArrayList).Add(combineInstance);                 }             }         }

下面是针对MeshFilter的处理代码:

    {             MeshFilter meshFilterCombine = gameObject.GetComponent();             if (!meshFilterCombine)                 meshFilterCombine = gameObject.AddComponent();             Mesh[] meshes = new Mesh[materials.Count];             CombineInstance[] combineInstances = new CombineInstance[materials.Count];             for (int m = 0; m < materials.Count; m++)             {                 CombineInstance[] combineInstanceArray = (combineInstanceArrays[m] as ArrayList).ToArray(typeof(CombineInstance)) as CombineInstance[];                 meshes[m] = new Mesh();                 meshes[m].CombineMeshes(combineInstanceArray, true, true);                 combineInstances[m] = new CombineInstance();                 combineInstances[m].mesh = meshes[m];                 combineInstances[m].subMeshIndex = 0;             }             meshFilterCombine.sharedMesh = new Mesh();             meshFilterCombine.sharedMesh.CombineMeshes(combineInstances, false, false);             foreach (Mesh mesh in meshes)             {                 mesh.Clear();                 DestroyImmediate(mesh);             }         }

将其组合成一个Mesh,接下来也是最后一步创建Mesh Renderer并将材质赋值给它

   {             MeshRenderer meshRendererCombine = gameObject.GetComponent();             if (!meshRendererCombine)                 meshRendererCombine = gameObject.AddComponent();             Material[] materialsArray = materials.ToArray(typeof(Material)) as Material[];             meshRendererCombine.materials = materialsArray;         }     }

下面我们看一下优化前后有啥变化,首先我们用四个Cube和一个Sphere,三种材质。效果图如下:

Unity3D静态对象优化系列二

下面我们将我们优化的图展示一下:

Unity3D静态对象优化系列二

对比上图我们可以看到Saved by batching减少了,Used Textures 较少了,Render Textures使用的纹理大小也较少了,虽然相对来说Draw Call增加了,但是由于Render Textures少了,我们的优化效果达到了,而且位置也没变,多种材质也没问题了,但是还有个问题,就是我们的Cube有三个是相同的,但是我们看其材质的效果图:

Unity3D静态对象优化系列二

相同的材质写了三次,这说明我们的程序还需要继续去优化,以上代码只要将其组合在一起就可以使用了,我们将在讲台优化系列三中继续优化我们的优化程序。

另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


网站标题:Unity3D静态对象优化系列二-创新互联
文章位置:http://hbruida.cn/article/cephpj.html