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

2021-02-20 騰訊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 / 海龜說到優化,不得不說所有優化的源頭都是從發現問題開始,第一步是分析,根據項目技術和資源結構的分析報告結果來劃出項目問題的可能範圍。 這是 Unity 主要周期循環,裡面的程序每幀會執行一次(注一)
  • Java 性能優化之最佳實踐
    21CTO 導讀:讓 Java 應用程式以最佳性能運行需要開發者的一些努力。本文為確保 Java 以最佳性能運行的方法。
  • Unity3D圖形性能優化最佳攻略 遊戲開發
    Unity官方文檔中有一篇是講圖形性能優化的,這篇文章無疑是指導Unity開發圖形優化的最佳文章。
  • Unity3D協程——協程的執行原理
    接上篇文章Unity3D協程——線程(Thread)和協程(Coroutine)協程是一個分部執行,
  • Unity協程性能分析
    在Unity中可以通過協程編寫同步執行但不會阻塞的偽線程代碼。這可以很方便的執行各種任務。但是在使用它之前,我們需要了解它的性能消耗。
  • 10種AWS成本優化最佳實踐
    這三個「解決方案」可能是大多數AWS用戶熟悉的AWS成本優化最佳實踐,但不一定是「最佳」實踐。有時,他們無法節省聲稱的成本的一小部分,而許多其他通常被忽視的AWS成本優化最佳實踐可以節省更多。正如我們已經提到的調整大小,調度和保留實例一樣,讓我們從這三個AWS成本優化最佳實踐開始。調整大小的目的是使實例大小與其工作負載相匹配。
  • 搜尋引擎優化最佳實踐
    搜尋引擎優化最佳實踐什麼是 SEO 最佳實踐?
  • 兩萬字長文:基於 Python 協程的並發編程實踐
    為了便於理解,我們這裡把協程看作這些映射出來的「微線程」。用戶程序控制的協程需要解決線程的掛起和喚醒、現場保護等問題,然而區別於線程的是協程不需要處理鎖和同步問題,因為多個協程是在一個用戶級線程內進行的,但需要處理因為單個協程阻塞導致整個線程(進程)阻塞的問題。下圖展示線程和協程的對照關係:生成器 - 協程基礎理解協程的掛起和喚醒,不得不提到生成器。
  • FinOps:雲成本優化的最佳實踐
    Joseph Daly就是一個雲優化總監,他的一個重要角色就是弄清楚Nationwide應該如何在雲中運行。   Daly表示,隨著全國範圍內越來越多的計算資源轉移到了AWS和Azure,它也遇到了優化雲計算的挑戰。為所需任務選擇正確的雲服務和實例的困難是遷移到雲端的一個常見問題。Daly說,雲計算的「黑匣子」也是如此,他指的是理解特定技術服務成本的挑戰。
  • React+Redux 性能優化實踐
    既然決定開始使用[ Redux + React ],我們就在網際網路上搜集了一些[ Redux + React ]最佳實踐,在所謂的最佳實踐中他們提到,要將所有的數據放在 Redux 層中,View層只做渲染和Action
  • 什麼是 「進程、線程、協程」?
    因此,多進程程序安全性更高。總之,多進程程序安全性高,進程切換開銷大,效率低;多線程程序維護成本高,線程切換開銷小,效率高。(Python的多線程是偽多線程,下文中將詳細介紹)什麼是協程協程(Coroutine,又稱微線程)是一種比線程更加輕量級的存在,協程不是被作業系統內核所管理,而完全是由程序所控制。協程與線程以及進程的關係見下圖所示。協
  • Android 開發中 API 層的最佳實踐
    我從12年開始做安卓開發,從這些年的開發經驗中對API層的實踐進行一些總結,內容方面主要是圍繞HttpClient的選擇,響應處理的編程模型和通知UI數據更新的最佳方式。以下內容僅僅是個人觀點,與實際內容如有出入,煩請指出;若噴,請輕點。
  • ELK 性能優化實踐
    一、背景介紹近一年內對公司的 ELK 日誌系統做過性能優化,也對 SkyWalking 使用的 ES 存儲進行過性能優化,在此做一些總結。本篇主要是講 ES 在 ELK 架構中作為日誌存儲時的性能優化方案。ELK 架構作為日誌存儲方案ELK日誌架構.png二、現狀分析1.
  • NSQ最佳實踐
    PHP-FPM作為非常成熟的PHP執行者,有完善的進程管理、垃圾回收、性能優化,並且常駐內存,非常適合作為最終消費者。並且PHP-FPM常駐內存並監聽9000埠,也非常適合承擔訂閱者的角色,代碼實時更新。將上述兩點融合,開發一個中間件,從NSQ訂閱數據,再以FAST-CGI協議推送給PHP-FPM。開發一個管理頁面,可以方便的配置和管理。
  • 一文講透 「進程、線程、協程」
    虛擬存儲器主要提供了三個能力: 由於進程擁有自己獨佔的虛擬地址空間,CPU通過地址翻譯將虛擬地址轉換成真實的物理地址,每個進程只能訪問自己的地址空間。因此,多進程程序安全性更高。總之,多進程程序安全性高,進程切換開銷大,效率低;多線程程序維護成本高,線程切換開銷小,效率高。(python的多線程是偽多線程,下文中將詳細介紹)什麼是協程協程(Coroutine,又稱微線程)是一種比線程更加輕量級的存在,協程不是被作業系統內核所管理,而完全是由程序所控制。
  • 程序丨Cocos Creator—最佳構建部署實踐
    這篇文章主要是我們團隊在使用Cocos Creator過程中的一些關於部署方面的實踐總結,標題黨了一回,嚴格來說,應該是《快看漫畫遊戲研發團隊使用Cocos Creator構建部署最佳實踐》,對於其他團隊可能並不是。
  • 淘寶首頁性能優化實踐
    本次淘寶首頁改版,雖已不再支持 IE6 和 IE7 等低版本的古董瀏覽器,但是依然存在多個影響首頁性能的因素:依賴系統過多,數據的請求分為三塊,其一是靜態資源(如 js/css/image/iconfont 等);其二是推到 CDN 的靜態數據(如運營填寫的數據、前端配置信息等);其三是後端接口,不同的模塊對應不同的業務,而且頁面中還有不少的廣告內容,粗略估計頁面剛加載時首屏發出的接口請求就有
  • 程序丨如何用Unity3D實現遊戲中的角色換裝?
    蒙皮網格渲染器用來渲染骨骼動畫。經上介紹並了解完模型裡的數據、蒙皮網格渲染器與網格、骨骼、材質幾個概念後,再來介紹unity3d換裝實現原理。基本原理:替換修改蒙皮網格渲染器的網格、骨骼、材質。以上是較為簡單的過程,一般為了達到優化,降低drawcall,需要合併模型網格,重新計算UV,合併貼圖材質。新的步驟:合併網格,合併貼圖,重新計算UV,刷新骨骼,附加新材質再設置UV。
  • DHCP最佳實踐(三)
    ↑ 關注 + 星標 ~ 從此不迷路,後臺回復【AD】送你Windows AD學習資料這是Windows DHCP最佳實踐和技巧的最終指南如果您有任何最佳做法或技巧,請在下面的評論中發布它們。在本指南(三)中,我將分享以下DHCP最佳實踐和技巧。
  • Netflix 網頁性能優化實踐
    Netflix 針對其登錄主頁的性能進行了優化,用戶在這個頁面上註冊或登錄到網站。這個頁面最初包含 300KB 的 JavaScript,其中一些是 React 和其他客戶端代碼(比如像 Lodash 這樣的實用程序庫),還有一些是補充 React 狀態所需的上下文數據。