博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Unity定时器堆栈显示
阅读量:6425 次
发布时间:2019-06-23

本文共 3617 字,大约阅读时间需要 12 分钟。

hot3.png

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

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

 

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

/** Author:  caoshanshan* Email:   me@dreamyouxi.comcode copy from https://git.oschina.net/dreamyouxi/XYGame; */using UnityEngine;using System.Collections;using System.Collections.Generic;using ExtBase;public sealed class TimerQueue : Singleton
{ ///
/// 添加一个真实时间定时器,返回函数调用即可 打断定时任务 /// ///
///
///
<0 will be run forever public VoidFuncVoid AddTimer(float time_delay, VoidFuncNN cb, int repeat_times = 1, params object[] objs) { return this.AddTimer(time_delay, () => { cb(objs); }, repeat_times); } ///
/// 添加一个真实时间定时器,返回函数调用即可 打断定时任务 /// ///
///
///
<0 will be run forever 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(); }; } ///
/// unity engine tick /// public void Tick() { this.Tick(ref list); } private void Tick(ref List
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
list_ms = new List
(); List
list = new List
();}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;}

 

转载于:https://my.oschina.net/kkkkkkkkkkkkk/blog/1528737

你可能感兴趣的文章
nginx负载均衡的5种策略
查看>>
90%人都不知道:SVN 和 Git 的一些误解和真相
查看>>
Android Studio NDK开发-其他编译选项
查看>>
关于this的全面解析(上)
查看>>
Python相对导入导致SystemError的解决方案(译)
查看>>
Swift 魔法:公开 Getter,隐藏 Setter
查看>>
[分享]iOS开发-UICollectionViewCell 布局
查看>>
NSURLRequestCachePolicy 缓存策略
查看>>
如何理解LXC与Docker之间的主要区别
查看>>
APP测试的新篇章
查看>>
Git小结
查看>>
orm2 中文文档 3.3 模型钩子
查看>>
Flask学习
查看>>
你真的会使用XMLHttpRequest吗?
查看>>
【数据可视化】艺术——图表的选择(上)
查看>>
Android换肤技术总结
查看>>
Mysql日志分析
查看>>
如何编写一个独立的 PHP 扩展(译)
查看>>
webview中嵌入部分html5适配的小方法~
查看>>
阿里云分析引擎Spark On 多数据源介绍
查看>>