在做游戲開發(fā)時,場景中的三角面和頂點數(shù)影響著運行效率,尤其是在手機平臺上,實時的知道場景中的各項指標,對性能優(yōu)化來說至關重要,下面我們來實現(xiàn)一個小功能,來實時計算場景中的三角面和頂點數(shù);
如果要知道場景中的三角面和頂點數(shù),首先我們要得到場景中所有的物體,如下:
GameObject[] ob = FindObjectsOfType(typeof(GameObject)) as GameObject[];
其次,在我們得到的這些Gameobject中,有的含有MeshFilter 有的不含有,我們要得到這些物體中哪些包含MeshFilter,所以:
Component[] filters;
filters = obj.GetComponentsInChildren();
然后我們再在這些filters中得到每個物體的三角面和頂點數(shù),然后再把他們相加,就是我們所要的知道的場景中所有物體的三角面的頂點總數(shù):
foreach (MeshFilter f in filters)
{
tris += f.sharedMesh.triangles.Length / 3;
verts += f.sharedMesh.vertexCount;
}
接下來,我們需要把得到的數(shù)據(jù)顯示在前端來供我們查看:
void OnGUI()
{
string vertsdisplay = verts.ToString("#,##0 verts");
GUILayout.Label(vertsdisplay);jiex
string trisdisplay = tris.ToString("#,##0 tris");
GUILayout.Label(trisdisplay);
}
在場景中運行,如下所示:
源碼如下:
using UnityEngine;
using System.Collections;
public class CalculateVertsAndTris : MonoBehaviour
{
public float f_UpdateInterval = 0.5F;? //刷新間隔
private float f_LastInterval;? ? ? //上一次刷新的時間間隔
public static int verts;
public static int tris;
// Use this for initialization
void Start () {
f_LastInterval = Time.realtimeSinceStartup;
}
///
/// 得到場景中所有的GameObject
///
void GetAllObjects()
{
verts = 0;
tris = 0;
GameObject[] ob = FindObjectsOfType(typeof(GameObject)) as GameObject[];
foreach (GameObject obj in ob)
{
GetAllVertsAndTris(obj);
}
}
//得到三角面和頂點數(shù)
void GetAllVertsAndTris(GameObject obj)
{
Component[] filters;
filters = obj.GetComponentsInChildren();
foreach (MeshFilter f in filters)
{
tris += f.sharedMesh.triangles.Length / 3;
verts += f.sharedMesh.vertexCount;
}
}
void OnGUI()
{
string vertsdisplay = verts.ToString("#,##0 verts");
GUILayout.Label(vertsdisplay);
string trisdisplay = tris.ToString("#,##0 tris");
GUILayout.Label(trisdisplay);
}
// Update is called once per frame
void Update()
{
if (Time.realtimeSinceStartup > f_LastInterval + f_UpdateInterval)
{
f_LastInterval = Time.realtimeSinceStartup;
GetAllObjects();
}
}
}
好了,這一章就寫到這,歡迎大家加入QQ群:280993838 ?或者關注我的公眾號: