孫廣東 2015.4.9 24:00
先來看看使用協程的作用1共有兩點:
1)延時(等待)1段時間履行代碼;
2)等某個操作完成以后再履行后面的代碼。總結起來就是1句話:控制代碼在特定的時機履行。
協程不是線程,也不是異步履行的。協程和 MonoBehaviour 的 Update函數1樣也是在MainThread中履行的。使用協程你不用斟酌同步和鎖的問題。
對使用協程帶來GC問題,不推薦使用了!。
使用我之前封裝的 游戲簡單控制邏輯Clock類 可以完善解決
我想要指出的是使用 "yield return new WaitForSeconds()" 將會每幀致使垃圾分配GC,21個字節,由于"new" 部份(相對標準的協程 "yield return null"只產生 9 個字節)。
若要避免此問題,只是提早設置你的wait 等待的時間......
現在你coroutine 協程每次調用只會引發最低 的9 字節 GC 分配 (不包括其他分配allocations,固然你可能通過您其他的代碼會致使 !)。
避免GC而做的事情的列表可能比較長。
- 不要使用Invoke或 StartCoroutine 的字符串。
- 不要使用GUILayout 和標記您的 GUI MonoBehaviour來避免每幀 800bytes的GC產生。 http://docs.unity3d.com/ScriptReference/MonoBehaviour-useGUILayout.html
- 不要使用 GameObject.Tag 或 GameObject.Name
- 不要在Update中使用GetComponent ,如果可能的話將其緩存
- 不要使用 foreach
- 不要使用string + ----》 StringBuild 或 string.Format()