天天看點

技術分享連載(五十七)

Q1:在整體的性能消耗上,CPU和GPU各占一半合理嗎?如果不是,各占多少為好?還是說需要根據機型來看?其次,我如何知道遊戲在手機上的GPU消耗?Profiler是看不到的,有工具推薦嗎?

首先,CPU和GPU是并行的,也就是CPU在運算的時候GPU也在運算,一幀的結束時間是兩者中比較晚結束的那個。是以,一般我們在考慮這個問題的時候,經常會說是CPU bound還是GPU bound,也就是GPU在等CPU還是CPU在等GPU。最理想的情況是兩者都并行均衡,且都沒有出現互相等待的情況。但在目前的大多數移動遊戲中,都是CPU耗時為主要性能瓶頸。這也是為什麼有多線程渲染的原因,多線程渲染就是利用CPU端的并行性,讓CPU處理得更快,不拖後腿。 其次,對于GPU的壓力分析,可以嘗試用Intel GPA,Mali或者高通出的針對自家晶片的工具。

Q2:UWA DAY 2017中提到“Animator優化可以把精度從8位減到3位”是什麼意思?如何實作呢?

Unity的動畫檔案中每個關鍵幀資料的數值精度會達到小數點後6位以上(如下圖一)。在Unity中可以通過将菜單“Edit->Project Settings->Editor”中的Asset Serialization選項設為"Force Text"獲得動畫檔案的文本,然後通過文本處理将所有資料數值精度降低到小數點後3位(如下圖二),這樣可以使動畫檔案的大小降低。
技術分享連載(五十七)
圖一
技術分享連載(五十七)
圖二 以133s的動畫檔案為例,在不開啟壓縮時,其記憶體大小為31MB,使用Keyframe Reduction選項可以降為8MB,進一步經過降低精度後,可以降為3MB。

Q3:我用DestroyImmediate 和 Resource.Unload 來進行解除安裝Prefab,在解除安裝前我擷取Prefab下所有的材質,發現有些檔案無法解除安裝,類似下圖中的MangedStaticReferences(),怎麼解除安裝這些資源呢?

技術分享連載(五十七)
從圖檔上來看,這個是資源被邏輯代碼緩存的問題。圖中YangCheng紋理之是以無法解除安裝,是因為它被YangCheng材質所引用,而YangCheng材質又被UIAtlas腳本所引用,ManagedStaticReferences表示此資源最終是被邏輯腳本所引用,即可能某個腳本中的變量或者Container對其仍有索引。從該圖來看,很可能是使用到該Texture的某個UI GameObeject沒有被釋放所緻。建議研發團隊可以檢測一下具體使用YangCheng材質的索引情況,定位其被索引的原因。一般主要有兩種可能,一是它自己本身被儲存于腳本變量中,二是引用它的GameObject被儲存于變量中。研發團隊可先從以上兩方面入手,對該資源進行檢測和排查。

Q4:我們項目做AssetBundle打包時,發現如果資源所依賴的C#Script的Public成員變量有變化時,用新代碼加載舊的AssetBundle就會不相容。有沒有什麼方法能判斷這些Script在變化時是否需要重新打AssetBundle呢?目前我們使用.CS檔案的MD5來判斷是否需要重新打包,但其實這樣應該有很多不必要的重複打包,對嗎?

該問題的本質原因是新代碼的序列化資訊變化所緻。建議研發團隊使用Unity 5的新的AssetBundle打包方式,預設情況下,Unity 5引擎會自動檢測其腳本的序列化資訊是否進行改變,進而自動進行增量打包。

Q5:Unity的材質的宏是有材質用到時才會被編譯嗎?還是說不手動Skip都會編譯?

在Unity中shader variant也包含兩種類型,一種是通過 shader_feature 定義,一種是通過 multi_compile 定義。而隻有通過 shader_feature 定義的 variant 在釋出時會根據其使用情況來進行剝離。具體可見Unity官方的文檔:https://docs.unity3d.com/Manual/SL-MultipleProgramVariants.html 需要注意的是,放在Always Included Shaders中的Shader,其包含的所有 variant 都不會被剝離,是以對于Standard Shader這類包含了大量 shader_feature的Shader,不推薦将其放入。

原文出處:侑虎科技

本文作者:admin

轉載請與作者聯系,同時請務必标明文章原始出處和原文連結及本聲明。

繼續閱讀