我們將從日常技術交流中精選若干個開發相關的問題,建議閱讀時間15分鐘,認真讀完必有收穫。如果您有任何獨到的見解或者發現也歡迎聯繫我們,一起探討。
UWA QQ群:465082844
UWA 問答社區:answer.uwa4d.com
Q:對於WWW.LoadFromCacheOrDownload(System.String url, Int32 version)這個接口的第二個參數,我知道是做緩存資源的更新用的。我們之前在Editor模式下作了一個測試:用該函數加載一個資源,Version參數設置為1,會發現在緩存目錄下生成了一個對應該資源的緩存目錄,這很正常。然後我們再次用這個接口加載這個資源,Version參數設置為2,現會發在緩存目錄下生成一個新的對應該資源的緩存目錄,並沒有覆蓋舊的目錄。這個情況在移動平臺上是否也是這樣的?
A:是的,在移動平臺上,通過LoadFromCacheOrDownload加載的AssetBundle,其Version版本號變化時,新的解壓Data是不會覆蓋舊的解壓Data的。清除舊的解壓Data主要有三種方式:
1. 設置緩存的過期日期,默認情況下是150天;
2. 調用Caching.CleanCache來全部清空緩存;
3. 當本地Cache已滿時,Unity會從最早的AssetBundle來進行自動清理。
此問答來自於UWA 問答社區:
https://answer.uwa4d.com/question/58ec4adfda71c21b3b1ac91f
如您對該問題仍有疑問,可以轉至社區進行進一步交流。
Q:我聽說WWW.LoadFromCacheOrDownload(System.String url, Int32 version)這個接口加載資源,如果是Unity 4.x的版本,會有500個資源的數量限制,如果超過這個限制,Unity會刪除之前緩存的每個資源,是這樣嗎?那在Unity 5.x 版本上是否還存在這樣的問題呢?
A:在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
如您對該問題仍有疑問,可以轉至社區進行進一步交流。
Q:我閱讀了UWA的你應該知道的AssetBundle管理機制一文,想對其中「每次加載都涉及到解壓操作」的理解進行確認:對於new WWW實際是解壓到WebStream。而如果是用的LoadFromCacheOrDownload,那麼資源是在磁碟,所以在調用www.assetbundle時才做解壓。那麼有個問題,如果使用直接獲取AssetBundle的那些API,解壓過程是怎樣的呢?CreateFromFile是在調用assetbundle.load的時候從磁碟解壓,CreateFromMemory是直接解壓到WebStream?
另外,對於WebStream來說,同一個WWW對象多次調用www.assetbundle方法時,得到了棧上的多個變量,但是這些變量都指向同一個WebStream中的對象嗎?
A:對於第一個問題,AssetBundle的解壓均發生在加載API的調用處,而不發生在www.assetbundle時,即無論是New WWW、LoadFromCacheOrDownload、LoadFromFile還是LoadFromMemory,其AssetBundle的解壓均在上述API調用處。在Unity 5.3版本之前,Create/LoadFromMemory是直接解壓到WebStream中,而在5.3後,則已經不存在WebStream這一說法了。具體可以查看官方文檔:https://docs
對於第二個問題,同一個WWW對象,多次調用www.assetbundle時並不出現WebStream的Clone操作,即這些變量均指向同一WebStream對象。
Q:我們在內存優化時發現一個問題,編輯器版本 Unity 5.3.4p6,使用UGUI,場景A中一個Text控制項使用自定義字體資源,然後把該控制項Text屬性勾選為空(disable),再Load一個空場景,看場景A卸載後在內存中的殘留,發現有一份引用是 ManagedStaticRefrences()的 Font 內存。如果不是把Text屬性disable,則場景A卸載後內存裡不會再殘留被引用的Font內存,請問可能是什麼原因造成的呢?相關例子已經提交給UWA。
A: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
如您對該問題仍有疑問,可以轉至社區進行進一步交流。
Q:我想了解如何使用頂點色Mask控制明暗關係,才能達到類似崩壞琪亞娜效果?
A:貼一個之前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
如您對該問題仍有疑問,可以轉至社區進行進一步交流。
今天的分享就到這裡。當然,生有涯而知無涯。在漫漫的開發周期中,您看到的這些問題也許都只是冰山一角,我們早已在UWA問答網站(answer.uwa4d.com)上準備了更多的技術話題等你一起來探索和分享。歡迎熱愛進步的你加入,也許你的方法恰能解別人的燃眉之急;而他山之「石」,也能攻你之「玉」。
官網:www.uwa4d.com
官方技術博客:blog.uwa4d.com
官方問答社區:answer.uwa4d.com
官方技術QQ群:465082844(非水群,僅限技術交流)
長期活動:UWA 技術診斷一對一!
近期精彩回顧
【UWA DAY 2017 精彩盤點】沒有橫空出世,只有厚積薄發!
【萬象更新】限時免費 | 用正確的方式,三天搞定Mono堆內存洩漏!
【惟學無際】基於物理的渲染-用真實的環境光照亮物體
【U Sparkle】GPU Skinning 加速骨骼動畫