技術分享小札第三彈 Profiler內存查看Navmesh動態加載...

2021-03-02 侑虎科技


 【技術小札】是UWA推出的技術交流欄目,我們會將開發團隊中反饋的常見問題加以總結並梳理在此,以供大家參考。同時如果你也是個熱愛分享、願與大家抱團進步的程式設計師,歡迎加入UWA的QQ群(465082844),與我們奇文分享,疑義相析。  

Q:如圖,在Editor中查看Profiler裡的內存詳細信息,發現Used Total中有個「Unity」,請問是什麼意思?為什麼會特別大?




A:  在Editor中運行時,「Unity」大是正常的,因為在Editor中運行項目時,引擎包含了所有的資源佔用的內存(除了部分紋理和Mesh是在GFX中),同時自身會進行很多的輔助操作來記錄各種遊戲運行信息。 

一般來說,在查看遊戲運行時的真實消耗內存,我們均是推薦直接在發布遊戲上通過Profiler進行查看,在Editor中運行遊戲所看到的內存是要大很多的。


Q: 在進行內存優化時,Unity Profiler給出的數據和Android系統(adb dumpsys meminfo,已經考慮memtrack的影響 )的數據差距較大(已經分析了Profiler自身的內存佔用),如何分析這部分差異,比如包括對顯存消耗進行準確統計,OS消耗的統計等等?

A: 內存差異較大是正常的,一般來說,Profiler統計的內存較為一致,而Android系統通過ADB反饋的PSS、Private Dirty等值則是差別很大。這主要是因為晶片和OS的不同而導致。具體的Android內存,建議直接查看Google Android OS的相關文檔。

Unity Profiler反饋的則是引擎的真實物理使用內存,一般我們都建議通過Profiler來查看內存是否存在冗餘、洩露等問題。 

Q:iOS上PVRTC不支持NPOT的貼圖壓縮,在Android上可以用ETC2,但在iOS上不能壓縮,內存消耗大。請問在iOS上有沒有好的處理方案?

A:ETC2僅能在支持OpenGL ES3.0的手機上進行使用,請研發團隊在使用前謹慎考察支持ES3.0的手機在國內的覆蓋範圍。

PVRTC不支持NPOT的貼圖壓縮,這是Apple規定的,上層應用無權對此更改。我們僅能建議將紋理儘可能做成POT形式,否則只能接受內存較大的開銷,沒有其他更好的辦法。

Q:怎樣動態加載Navmesh?


A:目前Navmesh不支持動態加載,只能隨場景一起加載, 因此可以考慮將帶有Navmesh的場景打包成AssetBundle,然後使用LoadLevel加載AssetBundle中的場景。

Navmesh的動態加載已經在Unity的Roadmap 中: http://unity3d.com/cn/unity/roadmap。

而當前,Navmesh是和場景綁定的,也就是說目前只能通過LoadLevel(不支持LoadLevelAdditive的加載方式)來加載場景的同時,自動加載對應的Navmesh數據。替代方案是:將多個「場景Prefab」的Navmesh 合併到同一個場景中烘焙好(互不重疊),然後再將這些「場景Prefab」分離到各個單獨的場景中去;在運行階段,Navmesh隨著第一個場景一次性加載,而對於其他的場景物件,再通過LoadLevelAdditive來加載對應的場景即可。缺點是為了使場景物件對齊Navmesh,在場景製作時就不能出現坐標上的重疊,因此僅供參考。

在Unity 5.x下,Lightmap的動態加載,需要通過腳本將烘焙時每個物件的Lightmapindex和Lightmapscaleoffset記錄下,並在運行時動態加載後設置回去的方式來實現。因為目前Lightmapindex和Lightmapscaleoffset信息是和場景綁定在一起,儲存在Lightmapsnap.assets 中,發布時也是放在場景信息中,因此不會記錄在Prefab 上。


Q:當關閉預渲染GI時會出現IndirectResolution,這個參數有什麼用,為什麼調大了以後會大大增加渲染時間,但是烘培出來卻沒有什麼效果。


A:該值主要控制的是GI的烘焙密度,數值越大,表示每個單位距離內的Texel越多,即烘焙得越精緻,自然烘焙的時間也越長。該值並非越大越好,場景越小建議該值越低。該值為1時,對於多數場景,其烘焙效果已經足夠了,升高該值,其效果也不會有明顯提升。

UWA已支持項目內成員相互邀請,共享測評數據。歡迎開發者邀請其他成員共同加入到項目中來,眾志成城, 讓優化更簡單!

拜託向朋友們推薦UWA喲,也許您的無心一轉,就可以解決其他朋友的燃眉之急😄

226 性能優化,進無止境---內存篇(上)

224 技術分享小札第二彈!|Lightmap 色差、丟失|內存洩露...

223 你應該知道的AssetBundle管理機制

222 資源檢測的正確打開方式(文末有大招)

218 性能優化,進無止境---CPU篇

203 揭開AssetBundle廬山真面目(二)

202 揭開AssetBundle廬山真面目(一)

127 技術分享小札第一彈!

119 深度檢測,專業分析,2016全新的性能優化方案來襲!



相關焦點

  • Android中apk加固完善篇之內存加載dex方案實現原理(不落地方式加載dex)
    點擊頂部藍字"Android技術分享"關注公眾號
  • 淺析動態連結庫側加載技術
    應用程式導入函數與DLL文件中的導出函數進行連結有兩種方式:隱式連結(load-time dynamic linking)也叫靜態調用和顯式連結(run-time dynamic linking)也叫動態調用
  • 【厚積薄發】技術分享連載(七十二)|深度剖析Occlusion Culling|頻繁開啟界面對堆內存的影響 |獲取GPU信息..
    另外也想獲知,Occlusion Culling的數據能否像NavMeshData那樣可以動態加載呢?謝謝!A:Occlusion Culling在使用後具體能提升多少,這個其實是沒有明確數值的,甚至可能不升反降!這個只能題主在自己的項目中進行嘗試。
  • ELF轉二進位(3/4):動態加載和運行
    前面兩篇分別討論了如何把一個轉成 Binary 的 ELF 作為一個新的 Section 加入到另外一個程序中執行:ELF轉二進位: 用 objcopy 把 ELF 轉成 Binary 並運行ELF轉二進位:允許把 Binary 文件加載到任意位置如何實現動態加載和運行本文繼續討論,但是方向是
  • 【流程分析】網絡拉取內存加載C#木馬
    動態調試下斷點:InternetReadFile 函數返回結束的地方。因為返回值是base64加密,而且是shellcode,所以懷疑出去之後解密數據,解密完之後把shellcode貼到內存中。直接下memcpy,發現程序都運行起來了,它都沒有copy...所以只能慢慢跟/找到它貼shellcode的地方,然後下斷點,動態跟蹤。動態調試shellcode的時候發現了C加載C#的函數。
  • AndroidStudio3.0最新 Android Profiler分析器(cpu memory network 分析器)
    為了幫助防止這些問題,您應該使用內存分析器來執行以下操作:在可能導致性能問題的時間軸中尋找不良的內存分配模式Dump Java堆,以便在任何時間查看哪些對象正在使用內存。長時間的堆轉儲可以幫助識別內存洩漏。在正常和極端的用戶交互過程中記錄內存分配,以精確地確定您的代碼在短時間內分配的對象或分配被洩漏的對象。
  • 技能分享:如何用生成器減少內存佔用,讓Python代碼運行更快?
    圖源:Unsplash如何使用生成器減少內存佔用並讓Python代碼運行更快,關乎你「代碼人生」的生死存亡。這意味著它們可以節省CPU,內存和其他計算資源。圖源:Unsplash今天,我們學習了如何使用python的生成器來減少內存使用並使代碼執行更快。
  • 類的加載(二)
    題目是:如何動態創建一個類?第三個參數是初始的內存空間大小。我們如果使用objc_allocateClassPair函數來創建一個類對象失敗了,那麼objc_allocateClassPair就會返回Nil。如果所要創建的類已經存在了,那麼就會返回Nil。
  • 性能優化-放開那片內存,讓我來!
    性能優化是一個常有的事情,通常來說本人對此沒有過多涉獵,僅分享工作中接觸到的一些內存。內存性能問題有很多方面會造成性能問題,例如:業務流程設計不合理,導致很多沒有必要的計算數據結構選擇不合適緩存使用不當示例假設你已經者使用profiler分析,已經發現內存分配是性能瓶頸:// 來源:公眾號【編程珠璣】// 作者:守望先生// malloc.cc#include <thread
  • Unity技術分享(83)|耗時分析|AssetBundle加載出錯|失真……
    原文連結:https://blog.uwa4d.com/archives/2091.html我們將從日常技術交流中精選若干個開發相關的問題,建議閱讀時間15分鐘,認真讀完必有收穫。如果您有任何獨到的見解或者發現也歡迎聯繫我們,一起探討。
  • JVM 第三篇:Java 類加載機制
    什麼是類的加載?類的加載指的是將類的 .class 文件中的二進位數據讀入到內存中,將其放在運行時數據區的方法區內,然後在堆區創建一個 java.lang.Class 對象,用來封裝類在方法區內的數據結構。
  • 【厚積薄發】技術分享連載(七十八)| UI元素重建 |BlendTree採樣原理 |LoadSubs(Async)加載性能...
    UWA QQ群:465082844UWA 問答社區:answer.uwa4d.comQ:對於運行時動態加載的普通模型比如怪物,我們目前的打包策略是把它單獨打一個AssetBundle包,通過AssetBundle加載並實例化的消耗。
  • 淺析java內存管理機制
    用於查看Jvm的堆棧信息,能夠查看eden,survivor,old,perm等堆區的的容量,利用率信息,對於查看系統是不是有內存洩漏以及參數設置是否合理有不錯的意義。非jvm命令—netstat:通過這個命令可以看到Linux系統當前在各個埠的連結狀態,比如查看資料庫連接數等內存洩露是指分配出去的內存沒有被回收回來,由於失去了對該內存區域的控制(例如你把它的地址給弄丟了),因而造成了資源的浪費。
  • 實例講解基於Volatility的內存分析技術Part 1
    信息安全專業人員可以通過內存取證,來調查和識別那些不會在硬碟驅動器數據中留下痕跡的攻擊或惡意行為。通過內存取證,安全人員可以了解運行時的各種系統活動,例如開放的網絡連接或最近執行的命令和進程等。程序在計算機上運行之前,首先需要被加載到內存中,這使得內存取證變得非常重要——這意味著所有被創建、檢查或刪除的程序或數據都將被保存到RAM中。
  • 內存攻擊技術及檢測 - 悅文天下
    駐留在內存中的惡意軟體利用內存進行攻擊是一種以多種形式出現、已經存在了十多年的攻擊技術;隨著時間的推移,越來越流行,也反映出了基於內存的技術成功地避開了安全產品和從業者檢測的現狀。一、內存攻擊技術內存攻擊技術包括:Shellcode注入、反射式DLL注入、內存模塊、進程冷注入(Process Hollowing)、模塊重寫以及 Gargoyle內存掃描逃避技術,共六種。
  • 【厚積薄發】技術分享連載(七十四)| 網格頂點屬性丟失| 優化數據表的加載| 圖集格式設置...
    一開始我們採用了ScriptableObject,把全部模板數據加載到內存並序列化為Asset的方式進行Assetbundle打包,該方案加載速度較為理想。第三個問題:配置讀取速度優化1、先從數據量上約減,減小數據冗餘重複,數據存儲設計優化,多次引用的欄位多引用等等;2、採用多線程加載,避免使用Unity提供的API,在遊戲啟動時,並行加載配置表,充分利用多核優勢; 3、就我們自己項目而言,沒有使用Lua的更新方案,但是我們依然採用Lua作為了數據存儲,經過優化後加載速度也不錯
  • 手機內存科普:你說的「內存」,其實不是內存?
    下圖是存儲器的金字塔式結構,摘自權威教材《深入理解計算機系統(第三版)》,手機的內存,也就是圖中的主存,快閃記憶體類似於本地磁碟,而高速緩存一般存在於CPU中(可以在CPU晶片上,也可以在片下)。它們之間的關係,簡單地說是這樣的:CPU從內存中讀取數據,而內存從快閃記憶體中加載數據。手機的內存是什麼?
  • 使用動態跟蹤技術SystemTap監控MySQL、Oracle性能
    另外,SystemTap會將你寫的SystemTap腳本動態編譯為內核模塊,然後加載到內核中運行。因此,它額外的性能損耗很小。SystemTap的使用非常簡單,本次分享將為大家介紹使用SystemTap腳本,計算MySQL的性能信息,解決「時間都去哪兒了?」之類的問題。另外,對於閉源的Oracle,SystemTap也可以更細粒度的統計它的性能信息,幫助我們理解CPU耗用。
  • 【221期】面試官:談談內存洩漏和內存溢出的聯繫與區別
    (memory leak)1、內存洩漏是指程序中已動態分配的堆內存由於某種原因未釋放或無法釋放,造成系統內存的浪費,導致程序運行速度減慢甚至系統奔潰等嚴重後果。二、內存洩漏原因1、在內存中供用戶使用的空間分為三部分:靜態存儲區:靜態存儲區數據在程序開始就已經分配好了內存,執行過程中,它們所佔的存儲單元是固定的,在程序結束時就 釋放,所以該區數據一般為全局變量。動態存儲區:動態存儲區數據是在程序的執行過程中根據需要動態分配和動態釋放的存儲單元。
  • C語言動態內存管理和動態內存分配
    動態內存管理同時還具有一個優點:當程序在具有更多內存的系統上需要處理更多數據時,不需要重寫程序。標準庫提供以下四個函數用於動態內存管理:(1) malloc()、calloc()分配新的內存區域。(2) realloc()調整已分配的內存區域。(3) free()釋放已分配的內存區域。上述所有函數都聲明在頭文件 stdlib.h 中。對象在內存中所佔空間的大小是以字節數量為單位計算的。