Unity-WIKI 之 AllocationStats(内存分配)

组件功能

allocationstats是一个简单的辅助工具,用于显示您的应用程序分配多少内存。它采用GC.GetTotalMemory来跟踪内存使用

image

 

使用方法

添加 Allocmem.cs 到场景中的任何GameObject。当你按下播放按钮,会显示一个小窗口包含以下信息。

Currently allocated(当前分配):显示GC分配的总内存

Peak allocated(峰值):显示了内存分配,()内的值是GC最后一次应用程序运行期间分配的最大内存

Allocation rate(分配率):显示了应用程序分配内存(以mb为单位),比如 0.3秒MB内存分配,在这个时候我应该修复。

Allocation rate(收集次数/频率):显示相距多远GC的集合间隔(秒)

Last collect delta(最后收集):显示帧率有多高,当GC上次调用,调用GC通常使帧率下降。

 

AllocMem.cs

using UnityEngine;
using System.Collections;
using System.Text;

[ExecuteInEditMode()]////使这个脚本在编辑模式下运行
public class AllocMem : MonoBehaviour
{

    public bool show = true;
    public bool showFPS = false;
    public bool showInEditor = false;
    public void Start()
    {
        useGUILayout = false;
    }

    // Use this for initialization
    public void OnGUI()
    {
        if (!show || (!Application.isPlaying && !showInEditor))
        {
            return;
        }

        int collCount = System.GC.CollectionCount(0);

        if (lastCollectNum != collCount)
        {
            lastCollectNum = collCount;
            delta = Time.realtimeSinceStartup - lastCollect;
            lastCollect = Time.realtimeSinceStartup;
            lastDeltaTime = Time.deltaTime;
            collectAlloc = allocMem;
        }

        allocMem = (int)System.GC.GetTotalMemory(false);

        peakAlloc = allocMem > peakAlloc ? allocMem : peakAlloc;

        if (Time.realtimeSinceStartup - lastAllocSet > 0.3F)
        {
            int diff = allocMem - lastAllocMemory;
            lastAllocMemory = allocMem;
            lastAllocSet = Time.realtimeSinceStartup;

            if (diff >= 0)
            {
                allocRate = diff;
            }
        }

        StringBuilder text = new StringBuilder();

        text.Append("Currently allocated            ");
        text.Append((allocMem / 1000000F).ToString("0"));
        text.Append("mb\n");

        text.Append("Peak allocated                ");
        text.Append((peakAlloc / 1000000F).ToString("0"));
        text.Append("mb (last    collect ");
        text.Append((collectAlloc / 1000000F).ToString("0"));
        text.Append(" mb)\n");


        text.Append("Allocation rate                ");
        text.Append((allocRate / 1000000F).ToString("0.0"));
        text.Append("mb\n");

        text.Append("Collection frequency        ");
        text.Append(delta.ToString("0.00"));
        text.Append("s\n");

        text.Append("Last collect delta            ");
        text.Append(lastDeltaTime.ToString("0.000"));
        text.Append("s (");
        text.Append((1F / lastDeltaTime).ToString("0.0"));

        text.Append(" fps)");

        if (showFPS)
        {
            text.Append("\n" + (1F / Time.deltaTime).ToString("0.0") + " fps");
        }

        GUI.Box(new Rect(5, 5, 310, 80 + (showFPS ? 16 : 0)), "");
        GUI.Label(new Rect(10, 5, 1000, 200), text.ToString());
        /*GUI.Label (new Rect (5,5,1000,200),
            "Currently allocated            "+(allocMem/1000000F).ToString ("0")+"mb\n"+
            "Peak allocated                "+(peakAlloc/1000000F).ToString ("0")+"mb "+
            ("(last    collect"+(collectAlloc/1000000F).ToString ("0")+" mb)" : "")+"\n"+
            "Allocation rate                "+(allocRate/1000000F).ToString ("0.0")+"mb\n"+
            "Collection space            "+delta.ToString ("0.00")+"s\n"+
            "Last collect delta            "+lastDeltaTime.ToString ("0.000") + " ("+(1F/lastDeltaTime).ToString ("0.0")+")");*/
    }

    private float lastCollect = 0;
    private float lastCollectNum = 0;
    private float delta = 0;
    private float lastDeltaTime = 0;
    private int allocRate = 0;
    private int lastAllocMemory = 0;
    private float lastAllocSet = -9999;
    private int allocMem = 0;
    private int collectAlloc = 0;
    private int peakAlloc = 0;

}

WIKI地址

http://wiki.unity3d.com/index.php/AllocationStats

posted @ 2014-04-06 18:11  赵青青  阅读(922)  评论(0编辑  收藏  举报