文档章节

Unity定时器堆栈显示

梦想游戏人
 梦想游戏人
发布于 2017/09/04 16:36
字数 510
阅读 96
收藏 0

码上生花,ECharts 作品展示赛正式启动!>>>

一般定时器是一个匿名函数,callback,在函数执行错误的话,很难查找到错误信息。

在这里可以利用添加定时器的时候 对调用栈进行一个快照,当发生错误时输出即可,这样调试起来方便多了。

 

AddTimer中栈 信息的一个快照为string 作为Timer对象的成员,release发行时可以去掉这种辅助机制

/*
* Author:  caoshanshan
* Email:   me@dreamyouxi.com
code copy from https://git.oschina.net/dreamyouxi/XYGame;
 */
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using ExtBase;

public sealed class TimerQueue : Singleton<TimerQueue>
{

    /// <summary>
    /// 添加一个真实时间定时器,返回函数调用即可 打断定时任务
    /// </summary>
    /// <param name="time_delay"></param>
    /// <param name="cb"></param>
    /// <param name="repeat_times">  <0 will be run forever</param>
    public VoidFuncVoid AddTimer(float time_delay, VoidFuncNN cb, int repeat_times = 1, params object[] objs)
    {
        return this.AddTimer(time_delay, () => { cb(objs); }, repeat_times);
    }
    /// <summary>
    /// 添加一个真实时间定时器,返回函数调用即可 打断定时任务
    /// </summary>
    /// <param name="time_delay"></param>
    /// <param name="cb"></param>
    /// <param name="repeat_times">  <0 will be run forever</param>
    public VoidFuncVoid AddTimer(float time_delay, VoidFuncVoid cb, int repeat_times = 1)
    {
        if (repeat_times == 0) return null;// () => { };
        Timer time = new Timer();
        time.delay = time_delay;
        time.cb = cb;
        time.repeat_times = repeat_times;
        //记录定时器添加的时候的快照栈信息,以 提供错误时 更多调试信息
        System.Diagnostics.StackTrace st = new System.Diagnostics.StackTrace(true);

        string ss = "\n";
        for (int i = 0; i < st.FrameCount; i++)
        {
            var f = st.GetFrame(i);
            string name = f.GetFileName();
            if (name.Length > Application.dataPath.Length)
            {
                name = name.Substring(Application.dataPath.Length, name.Length - Application.dataPath.Length);
            }
            ss += "   " + f.GetMethod().ToString() + " at " + name + " (" + f.GetFileLineNumber() + ") \n";
        }
        time.stackInfo = ss;
        time.Init();
        list.Add(time);
        return () =>
        {
            if (time != null && this.list.Contains(time))
                time.SetInValid();
        };
    }

    /// <summary>
    /// unity engine tick
    /// </summary>
    public void Tick()
    {
        this.Tick(ref list);
    }
    private void Tick(ref List<TimerBase> list)
    {
        if (list.Count < 1)
            return;

        for (int i = 0; i < list.Count; i++)
        {
            if (list[i] == null)
                continue;

            TimerBase timer = list[i] as TimerBase;
            timer.Tick();
        }

        for (int i = 0; i < list.Count; )
        {
            TimerBase b = list[i] as TimerBase;
            if (b.IsInValid())
            {
                list.Remove(b);
            }
            else
            {
                ++i;
            }
        }
    }
    public void Clear()
    {
        this.list_ms.Clear();
        this.list.Clear();
    }
    List<TimerBase> list_ms = new List<TimerBase>();
    List<TimerBase> list = new List<TimerBase>();

}


class TimerBase : GAObject
{
    public string stackInfo = "";
    public virtual void Tick()
    {

    }

    public VoidFuncVoid cb = null;
    public int repeat_times = 1;
    protected int repeat_times_current = 0;
}

sealed class Timer : TimerBase
{
    public override void Tick()
    {
        if (this.IsInValid()) return;

        if (current < delay)
        {
            current += Time.deltaTime;
            return;
        }
        if (cb != null)
        {
            try
            {
                cb();
            }
            catch (System.Exception e)
            {
                Debug.LogError(e.Message);
                Debug.LogError("add timer stackTrace:" + this.stackInfo);
                Debug.LogError("call stackTrace:" + e.StackTrace);
            }
            cb = null;
        }
        current = 0.0f;
        if (++repeat_times_current >= repeat_times && repeat_times >= 0)
        {
            this.SetInValid();
        }
    }

    public override bool Init()
    {
        return true;
    }
    float current = 0.0f;
    public float delay = 0.0f;

}

 

© 著作权归作者所有

下一篇: 总结2
梦想游戏人
粉丝 43
博文 491
码字总数 194264
作品 0
成都
私信 提问
加载中
请先登录后再评论。
全新的Unity跨平台开发 IDE JetBrains Rider 2019.2 x64特别版下载

Rider 基于 JetBrains 的平台,JetBrains 的平台很受那些使用 IntelliJ IDEA 的 Java 开发者和使用 WebStorm 的 JavaScript 开发者的欢迎。Rider 的主要 .NET 组件是 ReSharper,ReSharper 是...

osc_3rgq3dae
2019/08/20
7
0
Unity 2019.1 中文更新日志速览版

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhenghongzhi6/article/details/89370993 Unity2019.1已经正式发布,快来看看一些核心新功能吧! 完整版的中文...

关尔Manic
2019/04/18
0
0
Unity3D普通开发人员,U3D主程分别需要掌握的技能

Unity3D普通开发人员 1.会查看和搜索unity API文档,熟悉一些3D术语单词 2.查看别人的代码,能够依葫芦画瓢 3.能够制作一些常见的UI效果,善用缓动类插件,如Do Tween pro版有着更强大的功能...

jiahuafu
2019/05/18
0
0
DOTS(ECS,Job,Burst) 笔记,持续更新...

18年5月第一次了解 ECS相关的内容: (译)关于Unity 2018的实体组件系统(ECS)一 (译) 关于Unity 2018的实体组件系统(ECS)二 https://unity.com/cn/dots 重建Unity的核心 我们正在使用...

u010019717
03/31
0
0
【Unity】DnSpy断点调试Unity已发行游戏的dll

前言 DnSpy是本人一直在用的反编译软件,很好用,今天闲来无事的时候用DnSpy的调试功能断点调试了一下Unity的游戏【发行版】,很好用,于是想着要分享给大家。 前期准备 DnSpy下载 Unity调试...

东方怂天
04/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

ZOOM International开始以Elevēo品牌开展业务

所有ZOOM Int.产品、销售和服务正在向Elevēo品牌过渡 田纳西州富兰克林和布拉格--(美国商业资讯)--全渠道合规记录、人力资源优化(WFO)和呼叫中心收入保护软件的全球领导者ZOOM Internationa...

osc_vzt0zpwr
23分钟前
20
0
openEuler for arm64(鲲鹏)

设置repo软件源 [base] name=openEuler 20 base baseurl=https://mirrors.huaweicloud.com/openeuler/openEuler-20.03-LTS/OS/aarch64/ enabled=1 gpgcheck=1 gpgkey=https://mirrors.huawei......

chipo
23分钟前
8
0
Mysql 游标的简单使用方法

一、游标简介 1、游标简介 游标是一个存储在MySQL服务器上的数据库查询,它不是一条select语句,而是被该语句检索出来的结果集。有了游标可以方便的对该结果集进行逐行处理。 游标的设计是一...

文文1
24分钟前
10
0
怀里橘猫柴犬,掌上代码江湖——对话阿里云 MVP郭旭东

云栖号资讯:【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 简介: 跟郭旭东聊过之后,我对程序员的敬佩又多一分。这个92年的开发者,难能可贵...

osc_3b0dcpcm
24分钟前
9
0
CMAKE_CURRENT_SOURCE_DIR

CMAKE_CURRENT_SOURCE_DIR CMAKE_CURRENT_SOURCE_DIR 这是当前处理的CMakeLists.txt所在的目录 CMAKE_CURRENT_LIST_DIR (自2.8.3开始)这是当前正在处理的列表文件的目录. 来自Docs: CMAKE_...

osc_cdixgndu
25分钟前
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部