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

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

作者:Ian  

翻譯: Kelvin Lo / 海龜

系列回顧:

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

內存的消耗是關鍵性的指標,尤其是在像低階手機這種內存有限的平臺。 

在 Unity 檢查內存的問題最好用 Unity 放在 Bitbucket 上開源的內存檢查工具。整合這個工具到 Unity 很簡單,只要下載解開之後把裡面的Editor目錄拉進項目即可。

這套工具適用於 Unity 5.3 之後到目前的版本(Unity 5.6),當它連到 IL2CPP 建置的項目時可以捕捉到原生跟非原生程序內存耗用的信息。

裝好工具後確定項目設定是用 IL2CPP 編譯,把項目放到設備上執行後和 Unity 編輯器的 Profiler 窗口連接,然後打開 Memory Profiler 窗口(套件有裝好的話從 Window > MemoryProfilerWindow 開啟),並單擊 Take snapshot。

在數據收集並傳回 Unity 時,設備上的應用程式會暫停一段時間。然後 Unity 編輯器會開始解析接收的數據,這會需要一些時間。對於用了海量存儲器的項目有可能會花上 10-30 分鐘。

解析過程中請耐心等候

上圖是用 iOS 裝置執行 Standard Assets 裡的場景,顯示超過 ¾ 的內存用量來自於四張很大的貼圖,查出是飛機的機身相關貼圖。

這個圖表每一項都可以縮放,點進去能看更詳細的信息。

一個比較常見的內存問題是資源重複加載,貼圖通常是佔用內存最密集的資源,貼圖重複也是在 Unity 項目裡最常發生的問題之一。 

要找出是否有貼圖重複加載可以透過比對內存裡是否有兩個相同類型和大小的對象並檢查是否是從同一個來源加載的,在新版的 Memory Profiler 的接口裡,可以比對看起來相同對象的 Name 和InstanceID 字符串。 

Name 欄位表示的是加載對象的素材文件名,一般來說就是檔名(不含文件夾路徑跟擴展名)。InstanceID 表示的是由 Uinty 執行時分配的內部編號,這個編號會是每次執行產生的唯一編號。(注一)


上圖是一個簡單的案例表示,圖的左右兩側是在 Unity 5.4 裡用 Memory Profiler 所抓取的數據,圖中顯示的資源分別是在內存加載的兩張貼圖。兩張貼圖具有相同名稱和大小,代表它們可能是重複的。檢查了 Assets 目錄和其子目錄之後,只找到一個名為 wood-floorboards-texture 的圖檔,因此這非常有可能就是重複加載資源的問題。 

內存裡每個單獨的 UnityEngine.Object 都會在建立時分配一個唯一的 InstanceID,由於這兩張貼圖的 InstanceID 並不同,所以可以確定它們是兩份不同的加載內存的貼圖數據。 

由於檔名和大小相同 InstanceID 卻不同,因此可以判定這是重複加載的貼圖。(注二)

一般來說造成貼圖和資源重複加載內存最有可能的元兇是不正確的AssetBundle 卸除,關於這部分可以參考官網的 AssetBundles 最佳實踐系列文章,關鍵在於管理加載的資源這個章節。

檢查 Image Buffer、Image Effect 和渲染貼圖內存的使用情況

用 Memory Visualizer 你還能看到從渲染暫存區(Renderbuffers )提供給 Image effect 和 RenderTexture 對象的內存使用情況。

上圖是一個單純帶有一些 Image Effects 的場景所擷取的數據,Image Effects 為了要計算在內存配置了暫用的渲染暫存區,比較特別的是 Bloom 效果配置了一系列的暫存區。由於 Retina iOS 設備解析度很高,造成這些臨時暫存區消耗的內存比項目其他部分加總還多。

設想 iPad Air 2 的原生解析度是 2048x1536,這已經超出新一代的遊戲機和 PC 標準的 1080p,但卻要在平板上執行。取決於暫存區的位深度不同,一個全屏幕的 Render buffer 可能會用掉整整 24mb甚至 36mb 的內存空間。想要降低這個值可以把 Render buffer 的解析度減半,可以降低約 75% 的內存耗用,通常視覺上來看差別也不會太大。

要改善 Image Effects 佔用太多 Render buffer 和 GPU 資源的方法,可以採用 Unity 5.5 或以上版本支持的 「uber」 Image Effect,官方提供一個名為UberFX 的套件可以把許多不同層的 Image Effect 迭加在一起成單一一個效果後才送去運算, 能減少更多的開銷。

注一:請注意,編號是執行周期產生分配,同項目不同執行周期編號也不會相同。


注二:注意:如果在項目中有相同名字的貼圖,那這裡就要小心是否判斷錯誤,但相同名稱又相同大小的機率不高,仍可作為依據。

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

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

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

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

……


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

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

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

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

 

↓長按添加小編GAD-沫沫

相關焦點

  • 程序丨Unity3D性能優化最佳實踐(三):協程
    作者:Ian翻譯:Kelvin Lo / 海龜系列回顧:Unity3D性能優化最佳實踐
  • 程序丨Unity3D性能優化最佳實踐(四):資源審查
    作者: Ian 翻譯: Kelvin Lo / 海龜系列回顧:Unity3D性能優化最佳實踐
  • 程序丨Unity3D性能優化最佳實踐(一):分析
    作者: Ian    翻譯: Kelvin Lo / 海龜說到優化,不得不說所有優化的源頭都是從發現問題開始,第一步是分析,根據項目技術和資源結構的分析報告結果來劃出項目問題的可能範圍。 注意:本文裡使用的一些追蹤程序代碼是基於Unity 5.3版本,在未來這些功能有可能會變動。
  • Android性能優化:帶你全面實現內存優化
    僅限今日,24小時後恢復原價若想直接學習課程,掃碼學習(以下內容為正文)作者丨Harvey_Specterhttps://www.jianshu.com/p/42516966a6ff前言在 Android開發中,性能優化策略十分重要
  • Android性能優化--內存優化
    本文來自Dotry投稿,連結:https://www.jianshu.com/p/38b627adaecd上一篇文章關於Android性能優化--啟動優化探討了啟動優化相關的知識點,在本篇將介紹內存優化的相關優化。
  • Android性能優化:手把手帶你全面實現內存優化
    最近有想換工作的同學們,可參考《5月技術崗位內推|RN開發招聘啦》,再往下看,一篇關於性能優化的好文章,很值得去學習。前言在 Android開發中,性能優化策略十分重要本文主要講解性能優化中的內存優化,希望你們會喜歡目錄
  • 高頻面試點:Android性能優化之內存優化(上篇)
    眾所周知,內存優化可以說是性能優化中最重要的優化點之一,可以說,如果你沒有掌握系統的內存優化方案,就不能說你對Android的性能優化有過多的研究與探索。本篇,筆者將帶領大家一起來系統地學習Android中的內存優化。
  • 性能優化-放開那片內存,讓我來!
    性能優化是一個常有的事情,通常來說本人對此沒有過多涉獵,僅分享工作中接觸到的一些內存。內存性能問題有很多方面會造成性能問題,例如:業務流程設計不合理,導致很多沒有必要的計算數據結構選擇不合適緩存使用不當示例假設你已經者使用profiler分析,已經發現內存分配是性能瓶頸:// 來源:公眾號【編程珠璣】// 作者:守望先生// malloc.cc#include <thread
  • QQ音樂Android客戶端Web頁面通用性能優化實踐
    一、問題與目標作為一款注重於內容運營的應用程式,QQ 音樂 Android 客戶端的 Web 頁面日均 PV 達到千萬量級,評論頁、MV 頁等核心頁面均有 Web 頁面參與,或完全由 Web 實現。客戶端內 Web 頁面的打開耗時與 Native 頁面相距甚遠,需要系統性優化。
  • Unity3d遊戲程序開發培訓靠譜嗎?好就業嗎?
    Unity的遊戲開發引擎如此受歡迎,而市場上Unity3d的遊戲程序開發者卻供不應求,這就吸引了一大批遊戲愛好者想學習Unity3d遊戲程序開發,甚至未來想轉行Unity3d遊戲程序開發。那麼學習Unity3d遊戲程序開發,肯定靠自學是完全不夠的,還得需要參加專業的Unity3d遊戲程序開發課程培訓學習,只有這樣才能更系統更全面地掌握Unity3d遊戲程序開發技術,你說是不是呢。
  • 性能優化之PHP優化
    在我們平常寫代碼的過程中,除了資料庫的優化,針對與文件的優化,我們還需要對PHP執行優化,當然對於老司機來說,這都是毛毛雨咯~但是畢竟有新手嘛,於是,我整理這麼一片文章。(未完待續...)性能優化之PHP優化(一):PHP結構1.字符串
  • etcd 的性能怎麼樣?需要優化嗎?
    再來看 Storage 層,磁碟 IO fdatasync 延遲會影響 etcd 性能,索引層鎖的 block 也會影響 etcd 的性能。除此之外,boltdb Tx 的鎖以及 boltdb 本身的性能也將大大影響 etcd 的性能。從其他方面來看,etcd 所在宿主機的內核參數和 grpc api 層的延遲,也將影響 etcd 的性能。
  • Android性能優化總結
    這是來自一位粉絲「MeloDev」的投稿,講真,我這裡投稿的不少,但是只有我自己覺得很不錯的才會通過,這篇文章我覺得對大家有用,而且性能優化也算是我面試必問的一個話題了,所以這裡推薦給大家。性能指標1. 布局複雜度:布局複雜會導致布局需要更長的時間,從而導致進入應用慢、頁面切換慢;2. 耗電量:耗電量大會導致機器發熱、縮短機器的有效使用時長;3. 內存:內存消耗大會導致頻繁GC,GC時會暫停其它工作,導致頁面卡頓;內存洩露會導致剩餘可用內存越來越小;內存不足會導致應用異常;4.
  • 在K8S/OpenShift上開發應用程式的14種最佳實踐
    》和 《容器最佳實踐》有異曲同工之妙。我的目標是為開發人員提供指導和最佳實踐,以幫助他們成功地將應用程式部署到生產環境中。如果您是在K8S/OpenShift之上構建應用程式的開發人員,那麼您可能會對此博客感興趣。該博客包括兩類最佳實踐。第一類列出了提高應用程式可靠性的實踐,第二類包括了提高安全性的實踐。請注意,這兩個類別之間有些重疊。
  • 海量挑戰:騰訊雲ES可用性及性能優化實踐
    二、 高可用及性能方向的優化 1. 高並發請求 騰訊會議服務質量分析系統,從2月份進行ES架構的方案切換開始,寫入吞吐從5w/s不斷攀升,現已達到100w+/s。
  • 系統架構性能優化思路
    對於單用戶性能問題往往比較容易測試和驗證,對於並發性能問題我們可以在測試環境進行加壓測試和驗證,以判斷並發下的性能。如果是單用戶本身就存在性能問題,那麼大部分問題都出在程序代碼和SQL需要進一步優化上面。如果是並發性能問題,我們就需要進一步分析資料庫和中間件本身的狀態,看是否需要對中間件進行性能調優。
  • 程序丨Unity優化技巧(中):介紹具體的優化方式
    Top10使用Profile找到CPU佔用最靠前的函數,從最高的開始依次分析優化。定位的方法有很多,Unity的Profile,UWA的性能測試工具,比較推薦的是使用XCode,可以抓取一段時間內函數的開銷。更品均準確也可以看到更底層。
  • PHP7革新與性能優化
    Unicode字符格式支持(\u{xxxxx})匿名類支持(Anonymous Class)……二、跨越式的性能突破:全速前進1.  JIT與性能Just In Time(即時編譯)是一種軟體優化技術,指在運行時才會去編譯字節碼為機器碼。從直覺出發,我們都很容易認為,機器碼是計算機能夠直接識別和執行的,比起Zend讀取opcode逐條執行效率會更高。
  • android內存優化總結
    2.2 數據結構的優化hashmap替換成sparsearray2.3 圖片的優化採用緩存,圖片縮略加載基於不同手機的解析度獲取不同尺寸的圖片,必要時可以進行縮放以及色彩優化android 色彩模式說明:ALPHA_8:每個像素佔用1byte內存。
  • MySQL 性能優化之骨灰級,高階神技 !
    在進行MySQL的優化之前必須要了解的就是MySQL的查詢過程,很多的查詢優化工作實際上就是遵循一些原則讓MySQL的優化器能夠按照預想的合理方式運行而已。今天給大家講解MySQL的優化實戰,助你高薪之路順暢!二、優化的哲學注意:優化有風險,涉足需謹慎!