在學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()里面,結果很占記憶體,基本就是卡死。想問下原因。
uj5u.com熱心網友回復:
明顯就是死回圈uj5u.com熱心網友回復:
這是一個回圈,update不是真的卡死了,而是一種假死現象,只有等update里面的do-while回圈結束后才會執行下面的內容,可以考慮使用執行緒或者協程。uj5u.com熱心網友回復:
似乎是有結束回圈條件的啊,而且應該不是實作不了的條件啊。
uj5u.com熱心網友回復:
就是不想用協程才這么寫的。
其實我更想知道的是怎么寫一個順暢的定時方法
uj5u.com熱心網友回復:
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("時間到了");
}
}
uj5u.com熱心網友回復:
Update時while回圈沒有完,下一幀什么時候到來,肯定等你while回圈完成了,你在update中回圈實際上強制降低了幀率,低到你看到的現象是假卡死uj5u.com熱心網友回復:
攜程的好處我現在算是懂了其實我寫過LUA
GOLANG的攜程
但是我就是不知道為什么那么多原始碼喜歡用攜程,在UPDATE事件里
培訓機構的老師是這樣,某上市公司的商業原始碼也是
我用不用是無所謂的,或者C#也有更好的做法
我在我的博客好像也說過,我用C#用到2012年,那時候還不知道攜程是什么鬼,C#一直跟JAVA是多執行緒不就好了嘛
結果腳本出來就有攜程的,LUA如此,GOLANG也是如此,我懷疑JS也有攜程,待求證
攜程的概念也是手機UI至于WINDOWS很不同的地方,也可以說事超越了行程,事件這些舊的概念,這個在學校肯定不會教的
你那個滿頭白頭發的老師只會讓你做計時器,做個鬧鐘專案做為期末設計
那么多人用肯定有其原因
主要原因
就是要是你這些新人用,代碼放到攜程里(代碼寫很渣也無所謂),因為可以通過yield釋放給主執行緒,就算攜程慢,甚至崩了都無所謂
主執行緒占主導,占主要資源(也是就是LateUpdate,FixedUpdate)
做3D游戲,留多點資源給渲染,操作和通訊吧。。。。很合理
當你懂攜程的時候自然而然也就會用了
也不會有你這些問題
(我也是在我博客里面說過,你讓一個資深程式員寫一個計時器,他可能真不夠你快,甚至連TIMER怎么寫都忘了,唯一他比你好的只是他選擇的路比你選的路坑少而已,我在知憾訓答得,好像是)
uj5u.com熱心網友回復:
就算用了攜程,你還是會有這些問題的,因為這是代碼邏輯的問題。。。。。。。。。。。一個資深的程式員也會有很多代碼邏輯問題的,只是他會選擇坑比較少的代碼,,盡量少分析每一句是什么問題,然后減少除錯,要不調個幾天,除了調通,得到優化的代碼其實很少,寫C++的重構和互相學習的機會會多點,但現在CPP的程式員也很渣的。。。。。沒堅持個10年的CPP程式員什么都不是,但是你要是個堅持個10年的CPP,你腦子有問題uj5u.com熱心網友回復:
看到的現象是假卡死,這是一個回圈,update不是真的卡死了,而是一種假死現象,只有等update里面的do-while回圈結束后才會執行下面的內容。轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/61394.html
標籤:Unity3D
上一篇:vs2013位圖顯示和文字的問題
