技術分享連載(六十)
資源管理
Q1:對於WWW.LoadFromCacheOrDownload(System.String url, Int32 version)這個介面的第二個引數,我知道是做快取資源的更新用的。我們之前在Editor模式下作了一個測試:用該函式載入一個資源,Version引數設定為1,會發現在快取目錄下生成了一個對應該資源的快取目錄,這很正常。然後我們再次用這個介面載入這個資源,Version引數設定為2,現會發在快取目錄下生成一個新的對應該資源的快取目錄,並沒有覆蓋舊的目錄。這個情況在移動平臺上是否也是這樣的?
是的,在移動平臺上,通過LoadFromCacheOrDownload載入的AssetBundle,其Version版本號變化時,新的解壓Data是不會覆蓋舊的解壓Data的。清除舊的解壓Data主要有三種方式:
- 設定快取的過期日期,預設情況下是150天;
- 呼叫Caching.CleanCache來全部清空快取;
- 當本地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,那麼有兩種情況需要考慮:
記憶體中載入的AssetBundle數量。在iOS平臺上,通過該介面載入、同時存在於記憶體中的AssetBundle數量確實是有限的,接近300個,這是由於iOS上檔案控制程式碼數的限制導致。而該限制在Unity 5.0以後則被完善了,因為Unity 5引入了虛擬檔案系統,所以不再有這個限制;在Android平臺上,則沒有這個限制,或者說數量限制值非常大,基本可以忽略。
本地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
轉載請與作者聯絡,同時請務必標明文章原始出處和原文連結及本宣告。
相關文章
- 技術分享 | MySQL : SSL 連線淺析MySql
- Java技術分享:什麼是資料庫連線池?Java資料庫
- 技術分享主幹
- 技術分享| HTTP 代理HTTP
- 負載均衡技術(一)———負載均衡技術介紹負載
- GDD 2018 上海 技術分享
- Qtum x86 虛擬機器技術文件連載(二)QT虛擬機
- 技術選型的藝術---湖北技術價值分享會
- 技術分享:記憶體管理記憶體
- 分享Linux程式凍結技術Linux
- python爬蟲庫技術分享Python爬蟲
- Android技術分享| Context淺析AndroidContext
- Android技術分享| 自定義LayoutManagerAndroid
- 技術分享 | AlertManager 原始碼解析原始碼
- 技術分享 | kubernetes pod 簡介
- 技術分享 | ClickHouse-Keeper 初探
- 技術分享 | 域滲透AdminSDHolder
- 【技術向】Linux動態連結庫預載入型後門Linux
- Cocos 技術派:實時競技小遊戲技術實現分享遊戲
- 前端技術分享:Nginx負載均衡影片,基礎的實戰應用前端Nginx負載
- 技術分享 | my2sql 接入 DBeaver 案例分享SQL
- 技術分享:Linux多核並行程式設計關鍵技術Linux並行行程程式設計
- 專案實戰(連載):基於Angular2+Mongodb+Node技術實AngularMongoDB
- 與50位技術專家連線(贈技術全景圖)
- 大資料競賽技術分享大資料
- MongoDB技術分享:WiredTiger儲存引擎MongoDB儲存引擎
- iOS - 圖文混排技術方案分享iOS
- 技術分享 | MySQL 如何適配 AppArmorMySqlAPP
- 技術分享 | ProxySQL 搭配 MySQL HA (下)MySql
- 技術分享| 快對講如何降噪
- Java技術分享:NIO實戰教程!Java
- Flutter OnePass 專案技術方案分享Flutter
- 技術分享 | Redis 之分散式鎖Redis分散式
- 技術分享 | OceanBase 裡的 BUFFER 表
- 技術分享| anyRTC 8月更新迭代
- 技術分享 | 使用 RPM 部署 Oceanbase Proxy
- Java技術分享之變數命名Java變數
- 區塊鏈技術工坊 - 線下區塊鏈技術分享區塊鏈
- 物聯網6類技術無線連線技術的分析