Unity3D中如何计算场景中的三角面和顶点数

发表于2017-10-23
评论0 1.9k浏览

    在做游戏开发时,场景中的三角面和顶点数影响着运行效率,尤其是在手机平台上,实时的知道场景中的各项指标,对性能优化来说至关重要,为此下面就给大家介绍下计算场景中的三角面和顶点数的方法。

     如果要知道场景中的三角面和顶点数,首先我们要得到场景中所有的物体,如下:

  1. GameObject[] ob = FindObjectsOfType(typeof(GameObject)) as GameObject[];  
    
    其次,在我们得到的这些Gameobject中,有的含有MeshFilter 有的不含有,我们要得到这些物体中哪些包含MeshFilter,所以:
  1. Component[] filters;  
  2.         filters = obj.GetComponentsInChildren<MeshFilter>();  

    然后我们再在这些filters中得到每个物体的三角面和顶点数,然后再把他们相加,就是我们所要的知道的场景中所有物体的三角面的顶点总数: copy

  1. foreach (MeshFilter f in filters)  
  2.         {  
  3.             tris  = f.sharedMesh.triangles.Length / 3;  
  4.             verts  = f.sharedMesh.vertexCount;  
  5.         }  
    接下来,我们需要把得到的数据显示在前端来供我们查看:
  1. void OnGUI()  
  2.     {  
  3.         string vertsdisplay = verts.ToString("#,##0 verts");  
  4.         GUILayout.Label(vertsdisplay);jiex  
  5.         string trisdisplay = tris.ToString("#,##0 tris");  
  6.         GUILayout.Label(trisdisplay);  
  7.     }  
在场景中运行,如下所示:


    源码如下:

  1. using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. public class CalculateVertsAndTris : MonoBehaviour  
  5. {  
  6.     public float f_UpdateInterval = 0.5F;  //刷新间隔  
  7.     private float f_LastInterval;      //上一次刷新的时间间隔  
  8.   
  9.     public static int verts;  
  10.     public static int tris;  
  11.     // Use this for initialization  
  12.     void Start () {  
  13.         f_LastInterval = Time.realtimeSinceStartup;  
  14.     }  
  15.     /// <summary>  
  16.     /// 得到场景中所有的GameObject  
  17.     /// </summary>  
  18.     void GetAllObjects()  
  19.     {  
  20.         verts = 0;  
  21.         tris = 0;  
  22.         GameObject[] ob = FindObjectsOfType(typeof(GameObject)) as GameObject[];  
  23.         foreach (GameObject obj in ob)  
  24.         {  
  25.             GetAllVertsAndTris(obj);  
  26.         }  
  27.     }  
  28.     //得到三角面和顶点数  
  29.     void GetAllVertsAndTris(GameObject obj)  
  30.     {  
  31.         Component[] filters;  
  32.         filters = obj.GetComponentsInChildren<MeshFilter>();  
  33.         foreach (MeshFilter f in filters)  
  34.         {  
  35.             tris  = f.sharedMesh.triangles.Length / 3;  
  36.             verts  = f.sharedMesh.vertexCount;  
  37.         }  
  38.     }  
  39.     void OnGUI()  
  40.     {  
  41.         string vertsdisplay = verts.ToString("#,##0 verts");  
  42.         GUILayout.Label(vertsdisplay);  
  43.         string trisdisplay = tris.ToString("#,##0 tris");  
  44.         GUILayout.Label(trisdisplay);  
  45.     }  
  46.     // Update is called once per frame  
  47.     void Update()  
  48.     {  
  49.   
  50.         if (Time.realtimeSinceStartup > f_LastInterval   f_UpdateInterval)  
  51.         {  
  52.             f_LastInterval = Time.realtimeSinceStartup;  
  53.             GetAllObjects();  
  54.         }  
  55.     }  
  56. }  

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引