封装 UnityEngine.Debug.Log 为Dll

来源:互联网 发布:艾德思奇调价软件 编辑:程序博客网 时间:2024/06/06 09:38

在游戏发布时,有很多东西需要进行优化 ,消耗性能的东西 能减少就减少。

UnityEngine.Debug.Log 是很消耗性能的操作,即使我们选择的是Release 版本发布,这个函数仍然会执行并且输出Log ,不仅影响性能,还有可能泄漏隐私。所以我们在发布上线时会关掉Log。

using UnityEngine;using System.Collections;public class NewBehaviourScript : MonoBehaviour {    // Use this for initialization    void Start () {    }    void OnGUI()    {        if (GUILayout.Button("Log"))        {            Debug.Log("test Log");            Debug.LogWarning("test LogWarning");            Debug.LogError("test LogError");        }    }    // Update is called once per frame    void Update () {    }}

运行之后在界面上会有 一个按钮 ,点击之后会输出 Log 。
我们打开 Profiler 来监测 CPU的消耗。
这里写图片描述

可以看到 在点击按钮时,CPU 出现了一个小 波峰。 FPS从1000 掉到了 250 。

这里写图片描述

点击该波峰,定位到 对应的函数 ,可以看到 输出Log 占用了 84.8% 的CPU(当前)。
赶紧把它干掉吧。

我们来封装一个 LOG,编译成DLL,可以自己控制是否输出Log。
首先用MonoDevelop 新建一个 Library 项目。
右键References , 引用 UnityEngine.dll 。
删除默认的 System 。

这里写图片描述

这里写图片描述

添加以下代码:

/************************** * 文件名:SNKDebuger.cs; * 文件描述:Unity Log的封装; * 创建日期:2015/05/08; * Author:陈鹏; ***************************/using UnityEngine;using System.Collections;public class SNKDebuger  {    static public bool EnableLog = true;    static public void Log(object message)    {        Log(message,null);    }    static public void Log(object message, Object context)    {        if(EnableLog)        {            Debug.Log(message,context);        }    }    static public void LogError(object message)    {        LogError(message,null);    }    static public void LogError(object message, Object context)    {        if(EnableLog)        {            Debug.LogError(message,context);        }    }    static public void LogWarning(object message)    {        LogWarning(message,null);    }    static public void LogWarning(object message, Object context)    {        if(EnableLog)        {            Debug.LogWarning(message,context);        }    }}

把解决方案配置修改为 Release , 然后点击菜单栏 Build - Build ALL

这里写图片描述

找到生成的 SNKDebug.dll ,拖到Unity 中,然后像下面使用

using UnityEngine;using System.Collections;public class NewBehaviourScript : MonoBehaviour {    // Use this for initialization    void Start () {        //SNKDebuger.EnableLog = false;    }    void OnGUI()    {        if (GUILayout.Button("Log"))        {            SNKDebuger.Log("test Log");            SNKDebuger.LogWarning("test LogWarning");            SNKDebuger.LogError("test LogError");        }    }    // Update is called once per frame    void Update () {    }}

如果需要关闭Log ,只需要设置

SNKDebuger.EnableLog = false;
原创粉丝点击