程序丨Unity3D性能優化最佳實踐(三):協程

2021-02-07 騰訊GWB遊戲無界


作者:Ian

翻譯:Kelvin Lo / 海龜


系列回顧:

Unity3D性能優化最佳實踐(一):分析

Unity3D性能優化最佳實踐(二):內存




Coroutine 運作方式和其他腳本程序不同,大多數的程序消耗只會出現在追蹤報告裡的單一位置,在特定的回呼被執行,但是 Coroutine會出現在 CPU 報告的兩個不同地方。

所有在 Coroutine 裡的初始化程序,從方法開始到第一次的 yield,這部分的追蹤數據會出現在 Coroutine 啟動的地方,通常是 StartCoroutine 被呼叫的地方。直接從從 Unity 回呼啟動的 Coroutine(比如回傳值宣告成 IEnumerator 的 Start)則會顯示在各自的 Unity 回呼下。

所有剩下的 Coroutine程序,從第一次被繼續執行到結束,都會出現在 Unity 主循環下的DelayedCallManager 裡。

要知道為何會這樣,就必須了解 Coroutine 的運作方式。

Coroutine 底下有個 C# 編譯程序自動產生的類別的實例, 對程序設計師來說看起來像是一個普通的方法,但在實作上我們需要這個對象在每次呼叫之間保存這個 Coroutine 的狀態。因為 Coroutine 中的局部變量(local-scope variables)在 yield 之間必須保有之前賦予的值,所以這些局部變量會提到先前所說的 C# 編譯程序產生的類別,它的實例在 Coroutine 的執行結束之前會維持配置在堆積內存上(Heap memory)。這個對象也負責追蹤 Coroutine 的執行狀態:它會記住 Coroutine 在 yield 之後下一次該從哪邊繼續。

因此,啟動一個 Coroutine 所引起的內存消耗同等於一個固定的成本加上這個 Coroutine 用到的局部變量總合的大小。

啟動 Coroutine 的程序建構並呼叫這個自動生成對象上的方法,然後 Unity 的 DelayedCallManager 在 Coroutine的 yield 時給的條件(WaitForSeconds、WaitForFixedUpdate 之類的條件)滿足時再次呼叫它。由於 Coroutine通常在其他 Coroutine 之外啟動 ,這會讓它們的執行消耗拆分成上述兩個不同位置。




上圖可以看到 DelayedCallManager 正重新呼叫幾個不同的 Coroutine,像是 PopulateCharacters、AsyncLoad 和 LoadDatabase。

如果可以,儘可能用最少 Coroutine 做最多的事,雖然巢狀 Coroutine(從 Coroutine 再產生 Coroutine)非常好維護也能維持程序簡潔,但每次使用 Coroutine 就要配置新的追蹤用對象,用越多Coroutine 代表內存消耗也越多。

如果 Coroutine 幾乎每一幀都要執行,也沒有用 yield 在需要長時間等待的操作上,改回用 Update 或LateUpdate 會比較好。尤其是對那種周期很長或是無窮的 Coroutine 更是如此。

要記得很重要的一點是 Coroutine「不是」線程(threads),Coroutine 裡的同步(Synchronous)行為仍然是在主線程上執行的,因此如果你的目的是降低主線程在 CPU 上的消耗,就跟呼叫一般方法一樣必須避免在 Coroutine 上面執行會卡住(Blocking)線程的操作。

Coroutine 還是最適合處理長時間的異步操作,比如等候 HTTP 傳輸、資源加載或是檔案 I/O。





熱議丨無止盡加班的代價有多大?

程序丨這些你都看過了嗎?年度盤點top40

如何用代碼快速寫出一個排位榜?教程大公開

想讓你的遊戲運行速度快10倍?你要這樣做!

……


添加小編微信,發送【程序】,可享雙重福利

1.加入GAD程序猿交流基地獲取行業乾貨資訊觀看大牛分享直播

2.直接領取60G獨家程序資料庫,地址在小編朋友圈

包括騰訊內部分享、文章教程、視頻教程等全套資料

 

↓長按添加小編GAD-沫沫

相關焦點

  • 程序丨Unity3D性能優化最佳實踐(四):資源審查
    作者: Ian 翻譯: Kelvin Lo / 海龜系列回顧:Unity3D性能優化最佳實踐
  • 程序丨Unity3D性能優化最佳實踐(二):內存
    作者:Ian  翻譯: Kelvin Lo / 海龜系列回顧:Unity3D性能優化最佳實踐(一):分析
  • 程序丨Unity3D性能優化最佳實踐(一):分析
    作者: Ian    翻譯: Kelvin Lo / 海龜說到優化,不得不說所有優化的源頭都是從發現問題開始,第一步是分析,根據項目技術和資源結構的分析報告結果來劃出項目問題的可能範圍。 注意:本文裡使用的一些追蹤程序代碼是基於Unity 5.3版本,在未來這些功能有可能會變動。
  • Unity3D協程——線程(Thread)和協程(Coroutine)
    很多小夥伴會分不清線程和協程的區別,這也是很多初級程序面試經常遇到的題目,在此特出一個系列,專門講解Unity協程。
  • Unity協程性能分析
    在Unity中可以通過協程編寫同步執行但不會阻塞的偽線程代碼。這可以很方便的執行各種任務。但是在使用它之前,我們需要了解它的性能消耗。
  • Unity3D協程——協程的執行原理
    接上篇文章Unity3D協程——線程(Thread)和協程(Coroutine)協程是一個分部執行,
  • Unity3d遊戲程序開發培訓靠譜嗎?好就業嗎?
    Unity的遊戲開發引擎如此受歡迎,而市場上Unity3d的遊戲程序開發者卻供不應求,這就吸引了一大批遊戲愛好者想學習Unity3d遊戲程序開發,甚至未來想轉行Unity3d遊戲程序開發。那麼學習Unity3d遊戲程序開發,肯定靠自學是完全不夠的,還得需要參加專業的Unity3d遊戲程序開發課程培訓學習,只有這樣才能更系統更全面地掌握Unity3d遊戲程序開發技術,你說是不是呢。
  • Python 性能優化
    python採用標記和分代的垃圾回收策略,每次垃圾回收的時候都會中斷正在執行的程序,造成所謂的頓卡。infoq上有一篇文章,提到禁用Python的GC機制後,Instagram性能提升了10%。感興趣的讀者可以去細讀。Be pythonic我們都知道 過早的優化是罪惡之源,一切優化都需要基於profile。
  • GO語言:協程——Goroutine
    Go語言的協程——Goroutine 進程(Process),線程(Thread),協程(Coroutine,也叫輕量級線程) 進程進程是一個程序在一個數據集中的一次動態執行過程,可以簡單理解為「正在執行的程序」,它是CPU資源分配和調度的獨立單位。
  • etcd 的性能怎麼樣?需要優化嗎?
    再來看 Storage 層,磁碟 IO fdatasync 延遲會影響 etcd 性能,索引層鎖的 block 也會影響 etcd 的性能。除此之外,boltdb Tx 的鎖以及 boltdb 本身的性能也將大大影響 etcd 的性能。從其他方面來看,etcd 所在宿主機的內核參數和 grpc api 層的延遲,也將影響 etcd 的性能。
  • 程序丨Unity優化技巧(中):介紹具體的優化方式
    Top10使用Profile找到CPU佔用最靠前的函數,從最高的開始依次分析優化。定位的方法有很多,Unity的Profile,UWA的性能測試工具,比較推薦的是使用XCode,可以抓取一段時間內函數的開銷。更品均準確也可以看到更底層。
  • Python協程:概念及其用法
    ——蒙田《蒙田隨筆全集》上篇《Python 多線程雞年不雞肋》論述了關於python多線程是否是雞肋的問題,得到了一些網友的認可,當然也有一些不同意見,表示協程比多線程不知強多少,在協程面前多線程算是雞肋。好吧,對此我也表示贊同,然而上篇我論述的觀點不在於多線程與協程的比較,而是在於IO密集型程序中,多線程尚有用武之地。
  • 計算機語言協程的歷史、現在和未來
    最早提出「協程」概念的Melvin Conway,也是從如何寫一個只掃描一遍程序(one-pass)的COBOL編譯器出發。眾多的「高手」紛紛投入編譯器開發,可見一門新科學發展之初也是篳路藍縷。以現代眼光來看,高級語言編譯實際由多個步驟組合而成:詞法解析、語法解析、語法樹構建,以及優化和目標代碼生成等。
  • Python與協程從Python2—Python3
    協程的缺點:1)無法利用多核資源:協程的本質是個單線程,它不能同時將 單個CPU 的多個核用上,協程需要和進程配合才能運行在多CPU上2)進行阻塞(Blocking)操作(如IO時)會阻塞掉整個程序Python2中的協程
  • 在 Android 開發中使用協程 | 上手指南
    為了能夠避免協程洩漏,Kotlin 引入了結構化並發 (structured concurrency) 機制,它是一系列程式語言特性和實踐指南的結合,遵循它能幫助您追蹤到所有運行於協程中的任務。在 Android 平臺上,我們可以使用結構化並發來做到以下三件事:發出錯誤信號 —— 當協程失敗時,發出錯誤信號表明有錯誤發生。
  • QQ音樂Android客戶端Web頁面通用性能優化實踐
    一、問題與目標作為一款注重於內容運營的應用程式,QQ 音樂 Android 客戶端的 Web 頁面日均 PV 達到千萬量級,評論頁、MV 頁等核心頁面均有 Web 頁面參與,或完全由 Web 實現。客戶端內 Web 頁面的打開耗時與 Native 頁面相距甚遠,需要系統性優化。
  • 基於 Swoft 協程框架的 PHP 微服務治理
    協程最大的好處在於能夠提供極大的並發,因為它僅佔用內存,不存在進程/線程切換開銷,單個進程就可開啟50w個協程。我們在swoft 1.0的時候採用的技術方案和node.js的異步回調一樣,在2.0的時候開始嘗試實現協程,但是存在一些缺陷——協程不能用在所有的函數上,只能用在一些已經預定好的函數上。
  • Unity3D遊戲開發如何優化性能?—— LOD技術
    1、Erenow —— 在此之前今天我們來說下Unity遊戲開發時,性能優化用到的一項簡單技術
  • Golang 性能分析工具簡要介紹
    pprof 可以對我們所寫的算法甚至整個應用程式做性能分析,幫助我們快速定位效率低或者資源消耗多的地方。Go 提供了 pprof 以及 trace 工具,本文分別介紹這兩個工具的簡要用法,希望大家能夠快速了解以及快速入門 Go 的性能調優。先來一段演練在給大家介紹枯燥的基礎知識之前,先來看看一個簡單的例子,這個例子簡單粗暴,可以通過 pprof 快速定位協程阻塞問題。
  • 在K8S/OpenShift上開發應用程式的14種最佳實踐
    》和 《容器最佳實踐》有異曲同工之妙。我的目標是為開發人員提供指導和最佳實踐,以幫助他們成功地將應用程式部署到生產環境中。如果您是在K8S/OpenShift之上構建應用程式的開發人員,那麼您可能會對此博客感興趣。該博客包括兩類最佳實踐。第一類列出了提高應用程式可靠性的實踐,第二類包括了提高安全性的實踐。請注意,這兩個類別之間有些重疊。