Packages目錄下Shader打包疑問

1)Packages目錄下Shader打包疑問
​2)如何關閉資源的RW選項
3)RenderTexture單個像素的色值大於Shader的輸出值
4)客戶端揹包刷新機制
5)PBXProject.AddCapability添加失敗服務器


這是第218篇UWA技術知識分享的推送。今天咱們繼續爲你們精選了若干和開發、優化相關的問題,建議閱讀時間10分鐘,認真讀完必有收穫。網絡

UWA 問答社區:answer.uwa4d.com
UWA QQ羣2:793972859(原羣已滿員)框架

AssetBundle

Q:Unity引入了Package Manager來進行管理插件管理,例如URP引入Packages以後會有目錄Packages/com.unity.render-pipelines.universal@7.3.1。請教一下各位,如何對Packages目錄下的資源進行AssetBundle打包?ide

例如,工程目錄中有材質球引用到URP的Shader,那麼材質球打成AssetBundle以後會將Shader包含進去,會有Shader解析耗時。工具

A1:我這邊是隻使用SBP而不用Addressable,這樣經過使用AssetBundleBuild是能夠將Packages中的資源也打包成AssetBundle的。

將全部依賴到的Shader(包括Packages中的)都使用AssetBundleBuild設置到同一個shader.bundle的,打包後也解包確認了,Packages中的Shader也打包在shader.bundle而不會被包含在材質AssetBundle中。性能

感謝黃曉文@UWA問答社區提供了回答學習

A2:我在嘗試將現有項目轉成URP的時候,遇到和Addressable系統有些不兼容問題。
在打包引用了URP的Shader的Material時會發生Shader被重複打包現象。
若是想把URP的Shader單獨打包,又會發現由於不在Assets目錄內,Addressable管不到的問題。

個人解決方案是將用到的URP的Shader拷出來,放到Assets目錄下通用Shader目錄。
固然須要將該Shader更名,而且要注意將內部引用的Shader也一併拷出管理。測試

不過通常項目中使用的Shader每每仍是會本身編寫,直接使用官方提供總會遇到這種那種問題。所以我也會考慮儘可能不用官方默認Shader,這時對於URP而言天然更加須要將Shader拷出來進行改造了。優化

感謝黃程@UWA問答社區提供了回答網站

A3:通過 黃曉文 的思路,已經解決。
打包AssetBundle最重要的,就是指定資源Path的源路徑,以及去往的目的AssetBundle地址,這個問題關鍵是須要知道資源在Packages中的源路徑。

例如一個Packages下的Shader資源,Lit.shader,經過AssetDatabase.GetAssetPath能夠發現路徑是:Packages/com.unity.render-pipelines.universal/Shaders/Lit.shader,這個是正確的路徑,用它便可。

而錯誤的路徑分別是:

  1. Unity中看到的:Packages/Universal RP/Shaders/Lit.shader 錯誤。
  2. 在文件目錄中看到的:Packages/com.unity.render-pipelines.universal@7.3.1/Shaders/Lit.shader錯誤

因此得出結論:Packages下的資源打包,去除一下 @x.y.z 便可。

感謝題主一刀@UWA問答社區提供了回答

A4:能夠試試使用Scriptableobject或Material引用到Shader文件,而後把ScriptableObject或Material打到AssetBundle裏。

感謝上午八點@UWA問答社區提供了回答


Texture

Q:請問一下,一張經過代碼建立的RGBAHalf圖片,而後存儲圖片資源後綴爲.asset,這樣運行時圖片的RW選項是開啓的,會致使內存翻倍,你們知道有什麼辦法能關掉這種資源的RW選項麼?

A1:動態建立的Texture是無法關閉讀寫的,這裏截一下Texture2D的一個isReadable屬性獲取的接口說明:
// 摘要:
// Returns true if the Read/Write Enabled checkbox was checked when the texture
// was imported; otherwise returns false. For a dynamic Texture created from script,
// always returns true. For additional information, see TextureImporter.isReadable.
public override bool isReadable { get; }

感謝李星@UWA問答社區提供了回答

A2:解決了,補充一下上面Profiler測試的內存是在PC上測試的。
其實.asset圖片文件內有個序列化屬性爲isReadable改成0,在真機上測試運行時RW就是關閉的。

感謝題主範世青@UWA問答社區提供了回答


Rendering

Q:這幾天工程在進行粒子特效的性能檢測,咱們使用了UWA的ParticleEffectProfiler工具進行性能分析。在進行檢測的時候發現一個問題,單個廣告板的粒子Overdraw爲5,理論上應該是1的。我本身斷點發現,雖然相機的Shader片元輸出顏色爲fixed4(0.1, 0.04, 0.02, 0),可是在進行像素繪製次數計算的時候顏色的g = 0.2196…致使結算結果錯誤。後來向UWA反饋後,技術人員告訴我說把顏色空間改成Gamma就行了,試驗了一下,確實好了。可是我有困惑。

在線性空間下,Shader返回的g值爲0.04,爲何RenderTexture的g值爲0.2196…?線性空間下顏色在顯示器上顯示的不該該是0.04^2.2 <0.0016嗎?爲何會是0.2196…變大的值,難道顯示器自己也進行Gamma校訂嗎?再者,Untiy顏色的線性空間和Gamma空間是個什麼樣的邏輯,怎麼感受跟我學習的知識反着的,亦或者是我理解不到位。請各位大神幫忙解惑。

A1:先簡單解釋一下,Unity的Color Space爲Linear時,會在最後輸出階段,進行的伽馬校訂(Gamma Correction),將Linear空間的像素轉換爲sRGB空間。Gamma Correction會將顏色的亮度變大(補償),Unity會將補償後的像素值輸出給顯示設備(UWA的Effect Scanning工具會輸出到RenderTexture上)。

所以,使用UWA當前版本的的特效檢測功能,應該把項目的Color Space設置成Gamma。若是是Linear Space,計算獲得的Overdraw率會偏高。

Gamma Correction( transform the linear values into sRGB)的公式爲:

感謝Prin@UWA問答社區提供了回答


Script

Q:網遊客戶端同步揹包數據機制怎麼比較合理一點,如今的處理方式是:
1. 登陸的時候獲取用戶揹包全部的數據(這個數據量隨着遊戲運營時間變長,數據量變大)。
2. 服務器差別推送(變化的物品推送)。
3. 從比賽副本出來再全量請求一次全量揹包數據,防止差別的包應網絡緣由沒有收到包。

這樣的設計方案,實測流量消耗比較大,想優化一下流程,徵求各位意見,謝謝。

A1:通常都是這樣的,若是是TCP根本不須要3。

感謝littlesome@UWA問答社區提供了回答

A2:不知道題主所說的揹包數據具體有那些內容,通常揹包內存放的都是道具,或者寶箱(其實也是一種道具),碎片(也能夠是一種道具)等等。那麼這些屬性其實基本都是能夠序列化到本地文件或者scriptableObject的。這個本地文件,或者說對象保存了全部Item相關的配置屬性。那麼網絡通訊時只須要同步ID和數量就好了(根據具體需求可能還有別的,可是應該量不多才對。)

那麼假設只是同步ItemId,ItemCount,經過方法1全拉取其實通訊量應該不大。
假設2個數據都是int型,一組Item數據是8個字節,揹包存放1024個不一樣的Item才近8KB。

固然也能夠壓縮一下,int16能存放65535個不一樣ID了,而數量每每會設計的是有上限的,好比:9999,即便超過65535個道具,也能夠拆分紅兩個,這樣一個int的高位能夠存放ID,低位存放數量,1024個Item則是4k左右。

序列化後的道具配置表能夠作熱更下載。每每增長一些新的道具也會涉及到增長新功能,所以一塊兒更新也是必要的。

感謝黃程@UWA問答社區提供了回答

A3:能夠考慮利用ProtoBuf來同步網絡消息,序列化後會被壓縮得很小。服務器同步到客戶端的時候,也能夠利用GZIP來壓縮,實測壓縮率在1/9左右。

感謝蕭小俊@UWA問答社區提供了回答

A4:建議以下:

  1. 雙端各自維護一個揹包數據的版本號,Server修改揹包數據以後就版本號自增+1。客戶端在登陸的時候接受來自Server的揹包版本號,若是發現本地磁盤的版本號和Server給的版本號不同,則請求Server進行更新,至因而增量更新/仍是全量更新,看具體實現了。
  2. 差別化推送,也就是增量更新, 這個通常以key/value形式推送。

感謝上官狗蛋er@UWA問答社區提供了回答


Build

Q:這裏返回值都是true,可是隻有第三個PushNotifications這個添加成功了(XCode工程中能夠看到),其餘的都沒添加成功,版本Unity2019.4.8f1,這是爲何?
proj.AddCapability(target, PBXCapabilityType.SignInWithApple);
proj.AddCapability(target, PBXCapabilityType.InAppPurchase);
proj.AddCapability(target, PBXCapabilityType.PushNotifications);

A:InAppPurchase須要添加Storekit框架,而後加了Storekit框架後會自動加上對應Capability。

感謝吳方傑@UWA問答社區提供了回答

封面圖來源於網絡


今天的分享就到這裏。固然,生有涯而知無涯。在漫漫的開發週期中,您看到的這些問題也許都只是冰山一角,咱們早已在UWA問答網站上準備了更多的技術話題等你一塊兒來探索和分享。歡迎熱愛進步的你加入,也許你的方法恰能解別人的燃眉之急;而他山之「石」,也能攻你之「玉」。

官網:www.uwa4d.com
官方技術博客:blog.uwa4d.com
官方問答社區:answer.uwa4d.com
UWA學堂:edu.uwa4d.com

官方技術QQ羣:793972859(原羣已滿員)

相關文章
相關標籤/搜索