封装 UnityEngine.Debug.Log 为Dll ,游戏发布关闭 Log 减少性能消耗

本文参考雨松Mono的文章:

http://www.xuanyusong.com/archives/2782

Mono介绍的是Mac 上Console 编译DLL的方法,本文是在 Win7 系统使用MonoDeveloper 编译。

文章转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn/

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

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

文章转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn/

比如下面这段代码:

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的消耗。

文章转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn/

技术分享


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

文章转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn/

技术分享


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

文章转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn/

赶紧把它干掉吧。


我们来封装一个 LOG,编译成DLL,可以自己控制是否输出Log。

文章转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn/

首先用MonoDevelop 新建一个 Library 项目。

右键References , 引用 UnityEngine.dll 。

技术分享


技术分享

文章转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn/

添加以下代码:

/**************************
 * 文件名: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

技术分享

文章转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn/

找到生成的 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;

工程打包下载:

http://pan.baidu.com/s/1sjsPFC5


文章转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn/

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。