关于C#编写定时程序

LOSWind 2017-05-11 07:01:51
在学U3D,然后不想用里面的yield return new waitforsconds,就自己写了个计时程序。如下:
void Pause(int delayTime){
System.DateTime time = new System.DateTime ();
time = System.DateTime.Now;
int s;
do {
s = System.DateTime.Now.Second - time.Second;
} while(s < delayTime);
}
可是运行时发现一个很严重的问题,我把它放到别的方法里面,再放到Update()里面,结果很占内存,基本就是卡死。想问下原因。
...全文
574 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
cdcjk 2017-05-29
  • 打赏
  • 举报
回复
看到的现象是假卡死,这是一个循环,update不是真的卡死了,而是一种假死现象,只有等update里面的do-while循环结束后才会执行下面的内容。
LoveMollyWendy 2017-05-12
  • 打赏
  • 举报
回复
Update时while循环没有完,下一帧什么时候到来,肯定等你while循环完成了,你在update中循环实际上强制降低了帧率,低到你看到的现象是假卡死
yy763496668 2017-05-12
  • 打赏
  • 举报
回复 1
update本来是一帧执行一次,但是你的while循环会让计算机在某一秒进入之后必须等while循环执行结束后才能出来,而上面的代码还有一个比较致命的地方就是你在进入 while循环这一帧前对 time = System.DateTime.Now;进行了赋值操作,但是在循环内部s = System.DateTime.Now.Second - time.Second; System.DateTime.Now.Second 是随着时间变化的量,time.Second也是一个随着时间变化的量(已经测试过),也许你把time.second作为了一个常量了,而且两者的步长是一样的, 因此 s < delayTime用于成立。所以进入一个死循环。 以下的代码,我相信你会写,就是顺手粘下来了。
 
float timer = 0;
	// Update is called once per frame
	void Update () {
        timer += Time.deltaTime;
        if (timer > 100)
        {
            Debug.Log("时间到了");
        }
	}
LOSWind 2017-05-12
  • 打赏
  • 举报
回复
引用 2 楼 yy763496668 的回复:
这是一个循环,update不是真的卡死了,而是一种假死现象,只有等update里面的do-while循环结束后才会执行下面的内容,可以考虑使用线程或者协程。
就是不想用协程才这么写的。 其实我更想知道的是怎么写一个顺畅的定时方法
LOSWind 2017-05-12
  • 打赏
  • 举报
回复
引用 1 楼 avi9111 的回复:
明显就是死循环
似乎是有结束循环条件的啊,而且应该不是实现不了的条件啊。
avi9111 2017-05-12
  • 打赏
  • 举报
回复
就算用了携程,你还是会有这些问题的,因为这是代码逻辑的问题。。。。。。。。。。。一个资深的程序员也会有很多代码逻辑问题的,只是他会选择坑比较少的代码,,尽量少分析每一句是什么问题,然后减少调试,要不调个几天,除了调通,得到优化的代码其实很少,写C++的重构和互相学习的机会会多点,但现在CPP的程序员也很渣的。。。。。没坚持个10年的CPP程序员什么都不是,但是你要是个坚持个10年的CPP,你脑子有问题
avi9111 2017-05-12
  • 打赏
  • 举报
回复
携程的好处我现在算是懂了 其实我写过LUA GOLANG的携程 但是我就是不知道为什么那么多源码喜欢用携程,在UPDATE事件里 培训机构的老师是这样,某上市公司的商业源码也是 我用不用是无所谓的,或者C#也有更好的做法 我在我的博客好像也说过,我用C#用到2012年,那时候还不知道携程是什么鬼,C#一直跟JAVA是多线程不就好了嘛 结果脚本出来就有携程的,LUA如此,GOLANG也是如此,我怀疑JS也有携程,待求证 携程的概念也是手机UI至于WINDOWS很不同的地方,也可以说事超越了进程,事件这些旧的概念,这个在学校肯定不会教的 你那个满头白头发的老师只会让你做计时器,做个闹钟项目做为期末设计 那么多人用肯定有其原因 主要原因 就是要是你这些新人用,代码放到携程里(代码写很渣也无所谓),因为可以通过yield释放给主线程,就算携程慢,甚至崩了都无所谓 主线程占主导,占主要资源(也是就是LateUpdate,FixedUpdate) 做3D游戏,留多点资源给渲染,操作和通讯吧。。。。很合理 当你懂携程的时候自然而然也就会用了 也不会有你这些问题 (我也是在我博客里面说过,你让一个资深程序员写一个计时器,他可能真不够你快,甚至连TIMER怎么写都忘了,唯一他比你好的只是他选择的路比你选的路坑少而已,我在知乎回答得,好像是)
yy763496668 2017-05-11
  • 打赏
  • 举报
回复
这是一个循环,update不是真的卡死了,而是一种假死现象,只有等update里面的do-while循环结束后才会执行下面的内容,可以考虑使用线程或者协程。
avi9111 2017-05-11
  • 打赏
  • 举报
回复
明显就是死循环

2,535

社区成员

发帖
与我相关
我的任务
社区描述
Unity3D相关内容讨论专区
游戏unity 技术论坛(原bbs)
社区管理员
  • Unity3D
  • 芝麻粒儿
  • 「已注销」
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

Unity3D社区公告:

  1. 社区致力于解决各种Unity3D相关的“疑难杂症”。
  2. 社区不允许发布与Unity3D或相关技术无关内容。
  3. 社区版主邀请各位一道为打造优秀社区不懈努力。

试试用AI创作助手写篇文章吧