我想在一帧内获取某个方法的总执行时间。开始想用Time.time减去之前保存的时间。但是发现在一帧内永远返回的是0,多帧的话可以,看来Time.time只会在每一帧赋值更新一次,所以一帧内的就取不到了。
然后查了一下c#有一个Stopwatch的类可以帮我们记录时间,使用起来也挺便利的。。
using UnityEngine;
using System.Collections;
using System.Diagnostics;
public class NewBehaviourScript : MonoBehaviour {
void Start () {
float t = Time.time;
TestMethod();
UnityEngine.Debug.Log(string.Format("total: {0} ms",Time.time - t));
Stopwatch sw = new Stopwatch();
sw.Start();
TestMethod();
sw.Stop();
UnityEngine.Debug.Log(string.Format("total: {0} ms",sw.ElapsedMilliseconds));
Profiler.BeginSample("TestMethod");
TestMethod();
Profiler.EndSample();
}
void TestMethod()
{
for(int i =0; i < 10000000; i++)
{
}
}
}
如下图所示,Stopwatch就可以正确的取到上一个方法所消耗的时间。如果想同时测试多个方法,可以多次调用 sw.Reset(); 然后sw.Stop取ElapsedMilliseconds毫秒数即可。

当然也可以用 Profiler.BeginSample 和 Profiler.EndSample 但是就是要打开Profiler界面找到那一帧就可以看了。
- 本文固定链接: https://www.xuanyusong.com/archives/4184
- 转载请注明: 雨松MOMO于 雨松MOMO程序研究院 发表
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!


为啥子我在profile下面没有找到方法的监控哦。。。。
HI momo ~~你们对某个方法的消耗时间有评估吗? 比如某个方法长于多少时间就会考虑去优化?
这个不好说啊。 执行一次的 比如初始化方法 和执行多次的在Update里的方法 衡量标准不一样。。总之 尽可能的去优化。。
Debug.Log 这玩意本身耗时不少
对。 要IO操作嘛。。 所以发布的包一定要把这个去掉了。
Nice,之前只知道 U3D的Profiler.BeginSample不知道C#的Stopwatch
问下MOMO,知道生成出来的AssetBundle怎么加密吗?让别人无法破解。
assetbundl 转成byte[]然后对字节数组加密在存成2进制文件 。 load的时候在去解密这个二进制文件,byte数组在读取 就可以起到assetbundl解密
用rsa加密的可行性如何?
xxtea