Lightmap 色差、丟失|內存泄露...

Lightmap在PC上顯示正常,但是轉到Android平臺上存在色差,顏色普遍偏暗。

一般來講,有兩種情況可能會導致色偏和亮度差異。 

1. Unity烘焙的Lightmap是32bit的HDR圖,而移動設備通常不支持HDR圖(32bit per channel),會按照LDR圖(8bit per channel)的形式進行處理,因此會出現色偏問題。因此我們建議: 


 在移動平臺下使用Mobile/Diffuse材質,可載入Standard Assets(Mobile) package獲得。如果要獲得更合適的效果,需要自行修改Lightmap的DecodeLightmap函數,該函數可在Unity\Editor\Data\CGIncludes\UnityCG.cginc文件中找到。需要說明的是,這種方法也不能達到與PC端完全一致的效果。


 如果需要PC和移動平臺的顯示效果一致,可以用圖像編輯軟體修改Lightmap為LDR格式,例如PNG(8bit per channel)。


 爲了避免類似問題,請不要使用過於強烈的Light進行烘焙,因為Light的強度(Intensity)越高,色偏問題會越嚴重。若有陰影丟失時,可以嘗試檢查一下模型的Lightmapindex、Lightmapscaleoffset、UV2等影響Lightmap採樣的一些參數。


2.另一種可能是存在過曝現象,可以嘗試將playersettings -> use direct3d 11關閉,看問題是否解決。


QLightmap丟失。用Unity5.1.2的AssetBundle做熱更新,資源導出的時候分析了所有的依賴項單文件導出。比如在導出場景的時候場景的烘焙出來的LightmapSnapshot.asset文件導出不了,導致運行的時候場景的Lightmap丟失了。

LightmapSnapshot.asset 本身是Editor下使用的,並不能單獨被打包進AssetBundle。 運行時加載Lightmap,一種方法是把場景(.unity 文件)打成AssetBundle加載,Lightmap 信息會打入場景AssetBundle(因爲Lightmap信息和場景綁定)。另一種是通過Lightmapsettings.Lightmaps方法來運行時設置。需要注意的是,同時還需要重設Prefab的Lightmap信息(Lightmapindex和Lightmapscaleoffset),因爲Lightmap信息在Unity 5.x下不會保存在Prefab 上。


另外存在一種可能,Unity 5.x中加入了Shader Stripping功能,在打包時,默認情況下會根據當前場景的Lightmap及Fog設置對資源中的Shader進行代碼剝離。這意味着,如果在一個空場景下進行打包,則Bundle中的Shader會失去對Lightmap和Fog的支持,從而出現運行時Lightmap和Fog丟失的情況。 而通過將Edit->Project Settings->Gaphics下Shader Stripping中的modes改爲Manual,並勾選相應的Mode即可避免這一問題。

 

Q

Unity 5.3版本WWW有泄漏,用Unity的Profiler看不出來內存的變化,但用Android或者iOS的內存查看工具就能發現內存在一直增加。之前同樣的步驟測試5.2.3版本就沒問題。 如圖:




運行一段時間後

該問題已經在5.3.3版本中修復(特此感謝應龍互動張哲童鞋的發現,同時提醒開發者需要關注下自己的開發版本,5.3.3以前類似情況的項目可以參考一下。)


Q

 當我在AssetBundle打包時,只打包這個Prefab(...)的話,這個Prefab能夠正確實例化嗎?

這是不能正確實例化的,因爲AssetBundle中的資源和Resource文件夾下資源是不會建立依賴關係的(腳本除外,因爲開啓BuildAssetBundleOptionsCollectDependencies 時,腳本依然不會打包到AssetBundle中)。所以會出現Mesh、Material等的丟失。 



Q 

 假設有兩個界面Panel A和Panel B,它們均依賴一個共享Atlas C。AssetBundle打包時,如果我們將其分別打包的話,那麼在使用時是否不能將AssetBundle C進行卸載?如果在加載Panel A和B之前,將Atlas C加載到內存中,但是將AssetBundle C進行卸載,那麼在加載和實例化Panel A和B時,是否會出問題?

是的,不僅是Panel和Atlas,只要是A或B依賴於C,就必須保證在加載或實例化A或B時,C的AssetBundle一定存在於內存中。如果之前將C對應的AssetBundle進行卸載,則加載或實例化A和B時,引擎將無法自動將C綁定給A和B進行使用。

關於AssetBundle依賴性打包,我們已在之前的分享【揭開AssetBundle廬山真面目】中有所提及,您可以查看歷史消息瞭解詳細內容。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章