天天看點

技術分享連載(九十)

Q1:我們發現剛進入遊戲,Dalvik Heap的記憶體很高,導緻PSS比較高,切到背景,再切回遊戲,Dalvik Heap記憶體減少非常多。然後我嘗試使用網上說的Android調用GC的方式,System.GC,結合runFinalization。調用Runtime.getRuntime().gc(),都無法有效減少,不知道這塊是否有辦法有效調用一次?

我們查到原因了,是因為我們在Android層寫了一個splash,但這個splash是png的,分辨率是1920x1080,我們之前是 int splash_bg = getResources().getIdentifier(bgName, “drawable”, getPackageName()); m_BgView.setBackgroundResource(splash_bg); 這張圖檔在HideSplash會被處于遊離狀态,要等Java的GC調用後,才會回收,但實際圖檔按道理記憶體也不該漲100MB左右,我們用測試工程隻有Splash和SplashVideo,發現記憶體并不會增長那麼多,代碼一模一樣。後面隻能解釋,可能JVM後某種記憶體配置設定算法造成的,當本來比較低的情況,配置設定會比較少,當到達一定數量級,再配置設定,就會配置設定更大一塊記憶體(對Android底層機制不熟) 後面我們改為先從getResources裡獲得BITMAP,然後給ImageView,再HideSplash時候,調用Bitmap的手動釋放方法。

該問題來自UWA問答社群,感謝題主在解決後将其方法分享公開,如您對該問題仍有疑問,可以轉至社群進行進一步交流。

https://answer.uwa4d.com/question/5a2a04c27030070236a983f5

Q2:我有一個MeshRenderer,它擁有兩個材質,現在我想給其設定一個不同的MaterialPropertyBlocks,但據我所知,目前還沒有能實作這樣的辦法,因為當我從Renderer中得到MaterialPropertyBlock後,我是不能指定它還能應用于某個材質了是吧?不知道大家有沒有好的解決方法呢?

是的,MaterialPropertyBlocks是以MeshRenderer為機關的,而不是以Material為機關的。隻能建議題主對Mesh進行拆分,確定每個Renderer上隻挂一個Material。

該問題來自UWA問答社群,如您對該問題仍有疑問,可以轉至社群進行進一步交流。

https://answer.uwa4d.com/question/5a263f54d99fdb2b3c628873

最近項目從Unity 4 更新到Unity 5或Unity 2017時,在中低端Android機上,幀率降了10多幀,用Adreno Profiler上查了是GPU Bound。

我們遊戲對幀率要求比較高, 遊戲的時候必須滿幀運作, 是以這個問題很明顯。經過折騰,最後查出來是Unity 5 之後, 預設開啟了Blit, 分辨率越高,GPU壓力越大。 尤其在中低端機上,我用的是Adreno 405測試的, Unity 4能滿幀, 但Unity 5或者Unity 2017最高才45左右, 簡直不能忍。幸運的是,Unity 2017.2,官方終于開放了設定能禁止Blit. 但是Unity 5就沒這個運氣了, 根據官方的消息,他們暫時還沒有計劃把這個引入Unity 5.6,

具體文章可見:https://forum.unity.com/threads/big-performance-issue-with-unity5-on-android.338847

在發現和解決問題的過程中,錢康來同學提供了不少幫助,在此感謝!開這個問題也是讓大家知道下,免得像我當初摸石頭過河,花太多時間折騰。

該問題來自UWA問答社群,感謝題主的無私分享,建議使用Unity 2017 或者Unity 5 版本的開發者密切注意!如您對該問題仍有疑問,可以轉至社群進行進一步交流。

https://answer.uwa4d.com/question/5a282669a670486845f8a03d

Q3:這個[Triggers RebuildInternalState]是隐藏物體就一定會觸發的嗎?我看Profiler裡最後一列都有提示Warning,感覺挺重要的一個錯誤。這個要怎麼去避免呢,是否會導緻Animator.Initialize耗時又變得很明顯(在之前有做過緩存的情況下)

技術分享連載(九十)
這個是含有Animation元件的GameObject被Deactive時的引擎Warning,在很多情況下确實會造成較高的CPU耗時。對此,建議題主嘗試在GameObject不再需要使用時,直接将其移出螢幕外,并将其挂載的Component進行Disable,而非将其GameObject進行Deactive,這樣可以RebuildInternalState的發生。

https://answer.uwa4d.com/question/5a2a62cdff95f1253a1b365e

Q4:你好 我看了UWA關于Unreal全局光照的那篇文章,有幾點疑問想問下:

1、Unity的Lightmap烘焙時,為什麼不能從Normal map擷取Normal資訊呢?我看Unreal的Lightmass也是烘焙出兩張圖,一張方向一張顔色。它的顔色可以受NormalMap的影響嗎?

2、Unreal的一個場景多張Lightmap,例如白天到晚上,漸變是怎麼融合的呢?

1、Lightmap中的Directional資訊是指烘焙光照的方向資訊。在Lightmap中一張是記錄光照的Intensity,一張是記錄Direcitonal,這個Directional是用來參與Shading中方向相關計算的,例如:高光計算、與normal計算等。如果是純Dffuse材質也不用Normalmap,這個Directional資訊可以去掉,減少存儲和計算量。通常在材質中看到的Normalmap指的是Mesh的Normal與Lightmap中記錄的Directional并不是同一個值。 2、Unreal中的Precomputed Lighting Scenarios是儲存了多套Lightmap以及光照設定,隻能做到配合光照進行Lightmap切換,融合現在貌似還做不到。

Q5:烘焙的時候光照的Intensity考慮Normal就類似beast那樣,Lightmass烘焙的時候可以提供Normalmap嗎?

我是這樣了解的:Unity烘焙的時候用了輻射度,也就是先把模型分成塊,然後計算快與塊之間的反射,不會使用Normalmap。Normalmap提供的是細節的資訊,全局光照中間接光的計算結果相對比較低頻,比較平滑,加入高頻的資訊不一定會有好的效果。Unreal 4的lightmass可以有一個選項設定Static類型的光源在烘焙的時候使用normal map,其設在project settings->engine rendering->lighting中。

原文出處:侑虎科技

本文作者:admin

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