技術分享連載(六十)

weixin_33763244發表於2018-02-05

資源管理

Q1:對於WWW.LoadFromCacheOrDownload(System.String url, Int32 version)這個介面的第二個引數,我知道是做快取資源的更新用的。我們之前在Editor模式下作了一個測試:用該函式載入一個資源,Version引數設定為1,會發現在快取目錄下生成了一個對應該資源的快取目錄,這很正常。然後我們再次用這個介面載入這個資源,Version引數設定為2,現會發在快取目錄下生成一個新的對應該資源的快取目錄,並沒有覆蓋舊的目錄。這個情況在移動平臺上是否也是這樣的?

是的,在移動平臺上,通過LoadFromCacheOrDownload載入的AssetBundle,其Version版本號變化時,新的解壓Data是不會覆蓋舊的解壓Data的。清除舊的解壓Data主要有三種方式:

  1. 設定快取的過期日期,預設情況下是150天;
  2. 呼叫Caching.CleanCache來全部清空快取;
  3. 當本地Cache已滿時,Unity會從最早的AssetBundle來進行自動清理。

此問答來自於UWA 問答社群:
https://answer.uwa4d.com/question/58ec4adfda71c21b3b1ac91f
如您對該問題仍有疑問,可以轉至社群進行進一步交流。


資源管理

Q2:我聽說WWW.LoadFromCacheOrDownload(System.String url, Int32 version)這個介面載入資源,如果是Unity 4.x的版本,會有500個資源的數量限制,如果超過這個限制,Unity會刪除之前快取的每個資源,是這樣嗎?那在Unity 5.x 版本上是否還存在這樣的問題呢?

在Unity 4.x的版本中,如果通過LoadFromCacheOrDownload來載入AssetBundle,那麼有兩種情況需要考慮:

  1. 記憶體中載入的AssetBundle數量。在iOS平臺上,通過該介面載入、同時存在於記憶體中的AssetBundle數量確實是有限的,接近300個,這是由於iOS上檔案控制程式碼數的限制導致。而該限制在Unity 5.0以後則被完善了,因為Unity 5引入了虛擬檔案系統,所以不再有這個限制;在Android平臺上,則沒有這個限制,或者說數量限制值非常大,基本可以忽略。

  2. 本地Cache中快取的AsseBundle數量。無論是iOS、Android還是PC版本,都沒有500的數量限制,而是有一個硬碟佔用大小限制。具體來說,在WebPlayer平臺上,有50MB的快取限制,而在其他平臺上,則是4GB的快取限制。所以只要硬碟佔用大小不超過限定值即可。

此問答來自於UWA 問答社群:
https://answer.uwa4d.com/question/58ec4807da71c21b3b1ac91c
如您對該問題仍有疑問,可以轉至社群進行進一步交流。


資源管理

Q3:我閱讀了UWA的你應該知道的AssetBundle管理機制一文,想對其中“每次載入都涉及到解壓操作”的理解進行確認:對於new WWW實際是解壓到WebStream。而如果是用的LoadFromCacheOrDownload,那麼資源是在磁碟,所以在呼叫www.assetbundle時才做解壓。那麼有個問題,如果使用直接獲取AssetBundle的那些API,解壓過程是怎樣的呢?CreateFromFile是在呼叫assetbundle.load的時候從磁碟解壓,CreateFromMemory是直接解壓到WebStream?

另外,對於WebStream來說,同一個WWW物件多次呼叫www.assetbundle方法時,得到了棧上的多個變數,但是這些變數都指向同一個WebStream中的物件嗎?

對於第一個問題,AssetBundle的解壓均發生在載入API的呼叫處,而不發生在www.assetbundle時,即無論是New WWW、LoadFromCacheOrDownload、LoadFromFile還是LoadFromMemory,其AssetBundle的解壓均在上述API呼叫處。在Unity 5.3版本之前,Create/LoadFromMemory是直接解壓到WebStream中,而在5.3後,則已經不存在WebStream這一說法了。具體可以檢視官方文件:https://docs.unity3d.com/Manual/AssetBundleCompression.html

對於第二個問題,同一個WWW物件,多次呼叫www.assetbundle時並不出現WebStream的Clone操作,即這些變數均指向同一WebStream物件。


動畫模組

Q4:我們在記憶體優化時發現一個問題,編輯器版本 Unity 5.3.4p6,使用UGUI,場景A中一個Text控制元件使用自定義字型資源,然後把該控制元件Text屬性勾選為空(disable),再Load一個空場景,看場景A解除安裝後在記憶體中的殘留,發現有一份引用是 ManagedStaticRefrences()的 Font 記憶體。如果不是把Text屬性disable,則場景A解除安裝後記憶體裡不會再殘留被引用的Font記憶體,請問可能是什麼原因造成的呢?相關例子已經提交給UWA。

UWA對於該例子進行了檢測,的確能夠在 Editor 復現。查了下 UGUI 程式碼,能對 Font 產生引用的,主要是這個函式 FontUpdateTracker.TrackText(Text),其中會把 t.font 引用起來;而對應的解引用的函式為 FontUpdateTracker.UntrackText。因此,如果出現了兩者的呼叫不匹配,就有可能造成 font 的 ManagedStaticRefrences 引用。

進一步檢視後,可以看到在定義了 UNITY_EDITOR 巨集時,UI 元素會增加一個名為 OnValidate 的函式,Text 元件則在其中進行了 TrackText 的操作。
而最關鍵的是,該函式在 Text 元件以“未啟用”的狀態被例項化時同樣會被觸發,同時,如果這樣的 Text 元件在後續沒有被啟用過就被銷燬,其 OnDestroy 和 OnDisable 函式是不會被呼叫的,參見文件中的這句話:OnDestroy will only be called on game objects that have previously been active.
而 OnDisable 中才會呼叫 Untrack 解引用,所以造成了不匹配,導致了 font 的 ManagedStaticRefrences。
但是,OnValidate 函式只在 Editor 上才有,真機上不會發生上面說到的不匹配的情況。所以建議研發團隊先在真機上測試下是否還有這種情況,如果確實沒有,那麼就忽略該問題即可。

此問答來自於UWA 問答社群:
https://answer.uwa4d.com/question/58e4e793e042a5c92c3484e1
如您對該問題仍有疑問,可以轉至社群進行進一步交流。


圖形渲染

Q5:我想了解如何使用頂點色Mask控制明暗關係,才能達到類似崩壞琪亞娜效果?

貼一個之前Guilty Gear Xrd (http://qiankanglai.me/2015/10/09/ggx-part1)的例子,參考了 【翻譯】西川善司「實驗做出的遊戲圖形」「GUILTY GEAR Xrd -SIGN-」中實現的「純卡通動畫的實時3D圖形」的祕密—前篇(1)(http://www.cnblogs.com/TracePlus/p/4205798.html) 中的做法:

研發團隊可以在頂點色裡刷入明暗資訊,如下圖:
請輸入圖片描述

原來的效果如下:
請輸入圖片描述
接下來把頂點色的明暗乘上去(或者用其他的運算,主要就是用來控制亮度)
請輸入圖片描述
注意左臂腋窩部分…陰影部分變大了。至於具體的控制方法,個人認為一般點乘居多,美術只要控制好頂點色輸入的亮度就行。

感謝來自 UWA 問答社群的錢康來提供回答:
https://answer.uwa4d.com/question/58e5ffe180ca640f2736fc94
如您對該問題仍有疑問,可以轉至社群進行進一步交流。






原文出處:侑虎科技
本文作者:admin
轉載請與作者聯絡,同時請務必標明文章原始出處和原文連結及本宣告。

相關文章