优化Unity日志系统的消耗及在ILRuntime模式下双击能跳转到对应的文件行号

文章介绍了如何在Unity中控制日志系统,仅输出错误日志以减少性能消耗,并利用Conditional属性根据预处理器指令有条件地执行日志方法。此外,还讨论了UnityEditor下日志重定向的问题,确保在ILRuntime环境下能正确跳转到出错代码行,并提供了ILRuntime堆栈跟踪的实现方式。

方案:

Unity的日志控制:
日志系统打开,但是只打印错误日志。这样其他级别的日志就不会有打印消耗。

UnityEngine.Debug.unityLogger.logEnabled = true;
Debug.unityLogger.filterLogType = LogType.Error;

但是还是有字符串拼接的消耗。
Conditional属性是一个C#特性,它允许你根据预处理器指令的定义来有条件地执行方法。例如下面的代码:

[Conditional("OPEN_MAIN_LOG_LOGWARNING")]
public static void Log(object message,Object context)
{
   
   
    UnityEngine.Debug.Log(message,context);
}

如果没有OPEN_MAIN_LOG_LOGWARNING宏,编译的时候,所有调用Log的方法都会从Dll里去除。因此就没有了字符串拼接的消耗。

检查发现的问题:

  1. Unity Editor下的Debug函数不应该被替换
  2. 给ProjectStttings.asset文件修改宏的时候,应该全平台替换。
  3. 双击日志,非ILRuntime下和ILRuntime都能跳转到对应代码的行号。注意如果ILRuntime下加了
    DISABLE_ILRUNTIME_DEBUG就不会有行号的打印。
using System.IO;
using System.Reflection;
using System.Text.RegularExpressions;
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEditorInternal;
using UnityEngine;

/// <summary>
/// 日志重定向相关的实用函数。
/// </summary>
internal static class LogRedirection
{
   
   
    private static readonly Regex LogRegex = new Regex(@" \(at (.+)\:(\d+)\)\r?\n");

    [OnOpenAsset(0)]
    private static bool OnOpenAsset(int instanceId, int line)
    {
   
   
        var scriptComponent = EditorUtility.InstanceIDToObject(instanceId);
        string selectedStackTrace = GetSelectedStackTrace();
        if (string.IsNullOrEmpty(selectedStackTrace))
        {
   
   
            return false;
        }

        //是ILRuntime下日志
        if (selectedStackTrace.Contains("ILRuntime StackTrace"))
        {
   
   
            //如果跳转的不是我们的GalaDebugger,证明打开的不是第一行的url,让系统跳转
            if (!scriptComponent.name.Contains("GalaDebugger"))
            {
   
   
                return false;
            }

            Match match = LogRegex.Match(selectedStackTrace);
            if (!match.Success)
            {
   
   
                return false;
            
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KindSuper_liu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值