Unity技術分享(100)| Texture2DArray、粒子系統的性能開銷……

2021-01-10 侑虎科技

新年伊始,隨著大家緊鑼密鼓地開始了工作,UWA每周推送的知識型欄目《厚積薄發 | 技術分享》在節後的首個工作日迎來了第100篇!今天,我們繼續為大家精選了5個和開發、優化相關的問題,建議閱讀時間15分鐘,認真讀完必有收穫。如果您有任何獨到的見解或者發現也歡迎聯繫我們,一起探討。

UWA QQ

UWA 問答社區:answer.uwa4d.com

粒子系統

Q:請問粒子系統的消耗如何區分呢?哪部分是在CPU哪部分在GPU呢?一個空粒子(禁用所有模塊,包括Render)會有消耗嗎?如果有消耗,會體現在哪部分呢?

A:就目前的Unity引擎的原生功能而言,粒子系統中的狀態更新(粒子的位置、朝向、觸發事件等)均為CPU端開銷,具體表現在ParticleSystem.Update和ParticleSystem.EndUpdateAll等函數中。具體可以查看UWA性能報告中的這兩張圖:

同時,粒子系統在渲染時也需要在CPU端進行準備,比如粒子系統的Culling和Draw Call操作等等,這些也都屬於CPU端開銷,如下圖所示。

而GPU端的耗時則與其他Mesh渲染無差,主要和ALU、Bandwidth和Overdraw相關。但與其他一般場景渲染不同的是,粒子系統在GPU端的壓力往往在Overdraw中進行體現,如下圖所示:

上圖來自《極無雙》的性能詳細報告,大家可以參考完整數據來加深這部分的理解:https://www.uwa4d.com/demo/pa.html?v=5x&platform=android&name=jws&device=Mi5S#overdraw

一個空粒子其自身開銷理論上很小,但UWA這邊暫時沒有做過測試,題主可自行做一些測試,絕知此事要躬行。

此問答來自於UWA 問答社區,如您對該問題仍有疑問,可以轉至社區進行進一步交流。

https://answer.uwa4d.com/question/5a865162d35eb22c10a0a202

資源管理

Q:我用的是Unity 5.5 版本,由於項目採用LZ4格式的AssetBundle,如果直接放進StreamingAssets下,包就太大了。現在想把所有的AssetBundle打成一個壓縮包,再放進StreamingAssets,讓玩家在第一次安裝時,拷貝到PersistentDataPath目錄下再解壓。但目前不知道怎麼讀取Android平臺下的StreamingAssets目錄下的壓縮包,希望能得到指導,感謝!

A1:我們是直接使用的C實現的unzip庫,啟動遊戲的時候就常駐打開Apk,後面都直接通過unzip庫解需要的文件到緩存目錄來讀取,讀完了,不用就定期做一些清理。

感謝Lujian提供了以上回答

A2:在Unity的API裡應該就只有WWW(新版本裡對應UnityWebRequest)能訪問非Bundle文件了,但這個接口是異步的,另外.bytes操作會產生較高的堆內存分配,容易撐高堆內存峰值。

所以,有的做法是通過Android的Java API來讀取,可以參考下雨松MOMO的這篇文章裡用的Java接口:https://www.tuicool.com/articles/fAnYJ3I

此問答來自於UWA 問答社區,如您對該問題仍有疑問,可以轉至社區進行進一步交流。

https://answer.uwa4d.com/question/5a8105ab2174bd258ff90fc8

資源管理

Q:我用的是Unity 2017.2f版本,我們Prefab裡Image元素直接引用的是Sprite Atlas文件夾裡的圖片,現在把Prefab和Sprite Atlas分別打到兩個不同的AssetBundle裡,並且去掉了Sprite Atlas的include build的選項。拿工具查看Prefab和Sprite Atlas的Bundle發現,Prefab所在的Bundle會把Image元素引用的那張Sprite圖也打進來,而Sprite Atlas所在的Bundle裡不但包括了這個Atlas圖,並且原圖都在這個Bundle裡。這是為什麼呢?

A:UWA測試發現Unity 2017.2和2017.3都存在題主說的問題,不過也都能通過一些操作繞過這個問題。先說一下個人認為正常的現象:

include in build不應該影響Bundle的打包行為,且Prefab的Bundle中始終不應該有SpriteAtlas存在。但是如果不開啟include in build,正常加載完兩個Bundle,且實例化Prefab後,Sprite不會顯示,因為需要做一下late binding。

接下來說一下碰到的這個Bug:1)如果在第一次(打之前清空Bundle目錄)打Bundle時,include in build開啟了,那麼atlas會被打包進prefab的bundle中(即題主的問題);

2)但如果在第一次打Bundle時,include in build沒開啟,那麼就是正常現象(Atlas不在prefab的Bundle中);

有意思的是,在第二次打Bundle時,不論include in build有沒有開,結果都和上一次打包一樣。所以,繞過去的方法是:

先清空Bundle目錄,關閉include in build打一次Bundle;再開啟include in build打第二次。得到的結果就是Atlas不在Prefab的Bundle裡,同時Atlas的include in build是開啟狀態的。題主可以按這個步驟做個嘗試。

此問答來自於UWA 問答社區,如您對該問題仍有疑問,可以轉至社區進行進一步交流。

https://answer.uwa4d.com/question/5a822325847802258a06509e

渲染

Q:我從文檔(https://docs.unity3d.com/Manual/SL-TextureArrays.html)上來看,GLES3 Metal 已經可以支持了。最容易想到的就是地形的splat層,如果是四層splat,那麼就可以用一個Texture2DArray來代替,好處是減少了bind消耗。相關的知乎連結https://www.zhihu.com/question/56015505,其中根據龔大的意思來看,似乎還可以減少splat採樣次數,但根據自己的測試和理解來看並不行,因為Texture2DArray 的slice之間並不會 blending,不知是不是我理解問題。

我使用一個Texture2DArray來代替4層的Splat地形,從XCode上看開銷,並沒有任何的減小,那目前來看這麼做地形的意義就不是很大了。AssetStore上有一個插件叫MegaSplat就是使用Texture2DArray來達到很多層混合。目前想到的Texture2DArray還有一個可以利用的地方是場景貼圖。比如場景用到了多張1024的貼圖,或者多張lightmap,原來由於貼圖不同導致StaticBatching無法合併,現在就可以使用Texture2DArray來做了。還有比如UI上的icon之類的,可以合併到一個Texture2DArray來達到DrawCall的合併。

目前Texture2DArray最不利的地方是:只能通過代碼來創建,沒有編輯器的支持。如果要離線製作Texture2DArray,就需要為不同的平臺準備多份資源了。請問大家有沒有Texture2DArray的經驗可以分享呢?

A:UWA研究了Texture2DArray,看起來它是將多個2D的Texture組合起來變成一個對象,所以在使用的時候只需要綁定一次,就可以採樣多個2D Texture。的確如題主所說,採樣的時候還是一次只能採樣一個指定的slice,blend也需要另外的Shader代碼來完成。題主說了:

其中根據龔大的意思來看,似乎還可以減少splat採樣次數,但根據自己的測試和理解來看並不行

我感覺他的意思可能是:並不是每次採樣必須把所有的slice都採了,而是可以只採其中一部分。估計原本想表達的是一次採樣只採一個slice。

我使用一個Texture2DArray來代替4層的Splat地形,從xcode上看開銷,並沒有任何的減小,那目前來看這麼做地形的意義就不是很大了。

如果單從性能上看,Texture2DArray比Texture2D的確只是減少紋理綁定的開銷,然後在遊戲引擎中可能會對合批產生影響。其他的做法跟普通Texture2D是一樣的。Texture2DArray比Texture3D在LOD處理上不同,Texture3D會減少slice,這並不是渲染Terrain時想要的。然後Texture2DArray在filter的時候只會在U,V上做,而Texture3D還會在d上做,所以這部分Texture2DArray也比Texture3D性能更好。綜合這些因素可能是推薦渲染Terrain使用Texture2DArray的原因吧。題主通過實驗說明Texture2DArray渲染地形沒有減少開銷,也有可能是因為一般一個場景就一個地形,從綁4張紋理變成綁1張就少了幾毫秒,而且也不是每幀都綁,所以從整體效果上看不大出來。

UWA做了個簡單實驗驗證了一下,下圖分別是用Texture2D和Texture2DArray渲染地形結果和GLES API調用。實驗設備為三星S6。

Texture2D:

Texture2DArray:

其中,GLES API調用圖中紅色框表示紋理綁定的API調用,綠色框表示渲染API調用。WT表示了該API調用的耗時,單位為納秒。從Texture2D圖中可知一共有5次紋理綁定,分別對應於材質中的5張紋理綁定,而Texture2DArray圖中只有兩次調用,分別是splat紋理和四層混合紋理的綁定。從圖中可知一次glBindTexture的耗時大約為1000~10000ns,即最多0.01ms。因此,三次glBindTexture加上三次glActiveTexture也最多0.06ms。所以看不出來。

此問答來自於UWA 問答社區,如您對該問題仍有疑問,可以轉至社區進行進一步交流。

https://answer.uwa4d.com/question/5a7e9f79847802258a065084

物理

Q:我們正在開發一款超大地形的MMO遊戲,場景中的角色或者怪物較多,請問Unity引擎是否會對遠處(500m或1km外)的GameObject進行物理模擬?是否有設置可以降低這部分GameObject的物理模擬開銷?

A:Unity引擎確實會對遠處的GameObject進行物理計算,只要該物體是Active、掛載Rigidbody(Character Controller)組件並且沒有Sleeping的。Unity引擎並沒有原生功能可以根據距離的遠近來調整物理系統的計算,不過題主可以自行來進行控制,比如通過Culling Group或者自行計算GameObject的遠近來控制Rigidbody組件的Active和Deactive,從而降低整體的物理系統耗時。

此問答來自於UWA 問答社區,如您對該問題仍有疑問,可以轉至社區進行進一步交流。

https://answer.uwa4d.com/question/5a8e6c1bd35eb22c10a0a215

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

官網:www.uwa4d.com官方技術博客:blog.uwa4d.com官方問答社區:answer.uwa4d.com官方技術QQ(僅限技術交流) 活動!UWA DAY 2018 開啟報名!

近期精彩回顧【虛幻引擎學習之路】渲染模塊之光照系統【萬象更新】看完性能簡報,想不優化好都難!【厚積薄發】50次遊戲性能的深度優化,得出了這五條「毒雞湯」UWA問答:用心解決「你」的每一個問題!

相關焦點

  • 使用Unity 粒子系統實現 2D 人物足跡效果
    之後深入一想腳本大概要怎麼寫,感覺頭大的不行,又想到了 Hierarchy 裡面被 FootStep12345678 塞得滿滿當當的壯麗場面..還是換個方法吧 轉念一想:unity 的粒子系統似乎可以滿足所有特性:生成淡出銷毀全自動,跟隨人物也是基本操作,比較存疑的就是用腳本控制粒子的鏡像與旋轉。
  • Unity2018新功能搶鮮 | 粒子系統改進
    洪流學堂,讓你學Unity快人幾步Unity2018.1中對粒子系統進行了重大改進,包括功能、性能很多方面,快來看看吧!GPU網格實例化粒子系統現在支持GPU實例化來渲染網格。粒子系統使用Procedural Instancing,可以在此處詳細解釋:https://docs.unity3d.com/Manual/GPUInstancing.html實例化支持已添加到「Particle Standard Shaders」中,並將在所有新內容中默認啟用。舊版內容升級到Unity 2018.1後,可以使用Renderer模塊中的複選框啟用GPU實例化。
  • Unity項目開發過程中常見的問題,你遇到過嗎?
    例如texture是否開啟read/write?texture的壓縮格式?尺寸?非人形的model在導入時是否關閉了rigs?動畫模型是否開啟了Optimize Game Object選項?等等。沒有合理的構建和QA流程也有很多項目的構建並非一番風順,構建的版本也難以管理。
  • Unity粒子系統小技巧X1
    點 上 方 藍 字 可 關 注 我  乾貨分享篇
  • 巧用Unity 2D功能:只需六步開發簡單的2D UFO遊戲
    private Rigidbody2D rb2d; //Store a reference to the Rigidbody2D component required to use 2D Physics.private int count; //Integer to store the number of pickups collected so far.
  • Unity高級知識點總結:性能優化與圖形渲染進階
    xlua有針對這裡做NoGC的性能優化。5、緩存,預加載特效。兩個預加載時機,遊戲初始化的時候,或者技能模板初始化的時候。(四) 內存的性能優化1、壓縮紋理的使用。2、合理的釋放不必要的資源。引用計數。定期UnloadUnusedAssets3、粒子系統緩存佔用的內存。一個ParticleSystem佔用8k內存。
  • 2021新年匯總:Unity項目原型快速開發資源,看這一篇就夠
    2D Game Kit : https://assetstore.unity.com/packages/essentials/tutorial-projects/2d-game-kit-107098 Lost Crypt – 2D Sample Project : https://assetstore.unity.com
  • Unity 實用技巧 - 物理系統初識
    官方文檔:https://docs.unity3d.com/Manual/PhysicsSection.html01  Rigidbody(剛體)/ Rigidbody2D(2D剛體)在使用有時候需要以組合的形式附加到物體上,這種形式可以保持較低的處理器開銷,也增加一定的靈活性;但它們應該只有一個Rigidbody組件在父物體上。那組合的碰撞器也不能滿足我們的需求,這就需要 Mesh Collider;它可以精確的匹配對象的網格形狀。但不要經常使用,它對性能的要求挺高。
  • 簡化AR體驗創作,Unity MARS Query系統程序化生成場景的原理
    Unity MARS資料庫:  https://docs.unity3d.com/Packages/com.unity.mars@1.1/manual/MARSConcepts.html#the-mars-database  每條數據都以稱為數據ID(data ID)的一串數字做區分,每條數據又能包含任意數量的特徵(traits),即帶名稱的特定數據類型
  • 遊戲粒子碰撞魔法特效Unity遊戲素材資源
    分享最新的CG教程與素材資訊!
  • 【厚積薄發】線性空間下,如何處理GrabTexture顯示過亮的情況?
    這是第124篇UWA技術知識分享的推送。今天我們繼續為大家精選了若干和開發、優化相關的問題,建議閱讀時間10分鐘,認真讀完必有收穫。TexturePacker也只能提供被2整除的NPOT圖集,所以問問有沒有同學實現過類似的系統,給個思路。另外,再問幾個問題:1)項目中存在不同紋理壓縮格式會導致(較大的)性能損失嗎? 比如「全部ETC2"和「儘量優先ETC1,不行再ETC2」這兩種做法。
  • 28組炫酷多彩遊戲粒子碰撞爆炸特效Unity遊戲素材資源
    分享最新的CG教程與素材資訊!
  • 100G DWDM優化OSNR的技術
    首先,在不增加額外速率開銷的情況下,通過本振提升技術使得B2BOSNR與複雜算法SD-FEC性能接近。其次,基於100G技術天生對DGD和色度色散不敏感,可將Q 裕量從40G的3-3.5db 下降到2-2.5db,優化後的100G ONSR門限完全與40G相同。
  • 使用unity製作RPG遊戲3——2D精靈
    context=%7B%22nid%22%3A%22news_9564882242542237691%22%2C%22sourceFrom%22%3A%22bjh%22%2C%22url_data%22%3A%22bjhauthor%22%7D下面需要利用Tiled2Unity把01地圖導入unity下載Tiled2Unity,在根目錄下打開可執行文件進入unity。
  • PHP7革新與性能優化
    有幸參與2015年的PHP技術峰會(PHPCON),聽了鳥哥(惠新宸)的關於PHP7的新特性和性能優化的分享,一切都令人感到激動。鳥哥是國內最權威的PHP專家,他的分享有很多非常有價值的東西,我通過整理分享的PPT和收集相關資料,整理為這篇解讀性質的技術文章,希望能給做PHP開發的同學一些幫助。
  • 「百練」成鋼:NumPy 100練
    +編程題,Python 開源項目 Top100、80+ Python 項目和 100+ 本 Python 免費書等資源。Create a 2d array with 1 on the border and 0 inside16. How to add a border (filled with 0's) around an existing array?17.
  • unity業餘愛好者說一下
    unity業餘愛好者說一下,這幾天傳的關於《太吾繪卷》代碼的事幾乎都是無中生有的事...一群用.net和vs做工程的人談論第三方引擎做的遊戲...真是雞同鴨講。太吾繪卷現在針對幾個常見誤會說一下1.只有一個main (x)unity的腳本都是依附於各個精靈的,沒有main,只有update2.沒有注釋(x)你反編譯出來的代碼有注釋
  • 音視頻開發之旅(15) OpenGL ES粒子系統 - 噴泉
    一、什麼是粒子和粒子系統如何定義粒子?一個粒子有位置信息(x,y,z)、運動方向、顏色、生命值(開始和結束的時間)等屬性什麼粒子系統?目標:了解和運用粒子系統,實現比較炫酷的效果,從粒子噴泉著手。重疊覆蓋通過修改粒子的發射方向,看起來重疊效果也沒有了,真的是這樣嗎,還是不容易觀察到了?為了驗證問題我們同一時刻多加些粒子,即同時發送多批粒子粒子系統。修改也比較簡單,加個for循環即可。
  • 100G線路傳輸技術方案有哪些 100GE接口技術方案介紹【詳解】
    100G傳輸技術介紹  2008年,基於40Gbps速率的WDM系統已經規模商用,許多運營商和設備商都把眼光投向100G WDM系統。其中隨著100GE路由器接口標準化的完成,100G的長途傳輸也進入了議事日程。
  • Unity 2018.3 Beta版發布
    直播預告 | Unity面部捕捉解決方案課程(第一期)9月26日晚8點,Unity技術直播課程將帶來Facial AR Remote面部捕捉解決方案系列課程的第一期,感興趣的朋友趕緊預約吧![了解詳情...]