渲染大面積草地時,如何降低消耗?

2022-09-10 15:39:25 字數 3400 閱讀 1192

1)在渲染大面積草地時,如何降低消耗

2)使用loadfrommemory導致記憶體翻倍問題

3)對android x86平台的支援問題

4)ongui的堆記憶體分配問題

a1:回答如下:

1.使用drawmeshinstance;

2.上面這個api是不會進行視距剔除、視錐體剔除和遮擋剔除的。

下面有兩種方案:

a.將草地按區域分組,用每組的中心點計算視距,依據距離切換網格lod或剔除;還能用向量點乘簡單剔除在相機後方的草地(注意臨界問題)。

b.借助cullinggroup。

cullinggroup.onstatechanged事件繫結,通過事件觸發調整傳入;drawmeshinstanced的matrix順序和渲染數量(但是drawmeshinstanced只能指定渲染前幾個matrix);

通過cullinggroup.setboundingspheres實現視錐體剔除和遮擋剔除;

通過cullinggroup.setboundingdistances實現視距剔除和lod。

這個方案最好也進行區域分組,不然cullinggroup的事件監聽占用會比較高,在中端機上4000個監聽會佔約2ms的大小。

以後如果有對比兩種方案的效能,我再進行補充。

附:《cullinggroup api的使用說明》

《unity 3d研究院之lightmap支援gpu instancing》

《如何高效使用gpu instancing技術來進行草叢渲染》

公升級unity 2018,drawmeshinstanced不生效的問題

感謝題主李先生@uwa問答社群提供了回答

a2:使用indirect模式的instancing,配合compute shader實現視錐剔除和遮擋剔除。

感謝鄒春毅@uwa問答社群提供了回答q:uwa的幾篇文章中都有說到盡量不要用assetbundle.loadfrommemroy介面,因為這個介面會使得記憶體的占用翻倍,但是我用unity 2017.4.5f1進行測試後,發現assetbundle.loadfrommemroy和assetbundle.loadfromfile幾乎是沒有差別的,因為文章中也沒有關於體積具體的版本資訊。所以我想問是之前的unity 4.x或者unity 5.x版本才有這個問題?還是說測試用例是有要求的呢?另外,我是在pc上進行測試的,打包出exe,直接用任務管理器檢視記憶體占用情況,發現並沒有區別。

a1:應該是在c++裡面直接申請一塊記憶體用來解壓,mono占用不會變但是pss會增大,記憶體峰值也會變高,使用adb shell dumpsys meminfo packagename來檢視pss。

如果目標平台是pc,那就說明記憶體策略可能是分配後立即歸還給作業系統了。如果pc不是目標平台,那麼看記憶體就沒有很大的意義。

感謝張迪@uwa問答社群提供了回答

a2:loadfrommemroy輸入的byte陣列用的是mono堆記憶體,哪怕這個記憶體有釋放,但mono堆記憶體總量是只公升不降的,在載入資源的過程中,一旦mono觸發gc後仍記憶體不夠,很可能需要申請新的mono記憶體,這會導致mono記憶體持續公升高。

而且用loadfrommemroy沒有必要性,用這個介面哪怕記憶體不是問題,也會在載入資源時明顯比loadfromfile慢不少,而且真的想要逆向assetbundle資源還是很容易的。退一步說,非要加密建議使用loadfromstream,然後自己去實現stream解密。

感謝loy_liu@uwa問答社群提供了回答

a3: 我之前的測試有問題,現在更正一下:loadfrommemroy即使在pc平台也不如loadfromfile介面。

經測試,pc上loadfrommemroy介面記憶體的占用大概會高1/5左右,載入時間比loadfromfile介面慢1/5左右,而且如loy_liu所說,loadfrommemroy介面需要先讀取byte陣列,會產生mono記憶體的分配問題,而loadfromfile不會。在android平台上,記憶體的對比非常誇張,我這邊測試的資料翻了接近3倍。

所以盡量不要使用loadfrommemroy介面,我沒有去測試loadfromstream介面的效能和記憶體,但據說和loadfromfile差不多。

感謝題主fdy@uwa問答社群提供了回答

a4: lzma的資源包loadfrommemory會導致資源本身翻倍。l4z資源包類似於管理器,本身占用記憶體很小,翻倍也沒關係,而記憶體流本身也是用完就能扔。

感謝歐月松@uwa問答社群提供了回答q:目前專案發布後大於100mb,檢查發現是libil2cpp.so較大,大概大於60mb,而且同時支援了armv7、arm64、x86,相當於x3的大小。所以想問一問大家,目前x86架構的機型大概佔比多少?需要繼續支援嗎?

a1: 沒必要,我建議去掉。

感謝loy_liu@uwa問答社群提供了回答

a2: 大多數模擬器都是x86,可以考慮下。

感謝歐月松@uwa問答社群提供了回答

a3: 需要支援,否則模擬器會很卡。

感謝fly@uwa問答社群提供了回答q:在pc上執行遊戲,用profile工具檢測的時候,發現guiutility.begingui記憶體洩漏,每次呼叫產生0.8kb的記憶體消耗,每幀呼叫4次,就是3.2kb。請問這是什麼原因引起的呢?

a:ongui必然有gc alloc,即使是空函式。你可以拿巨集括起來,用來做profiling的包不要編譯進去。

感謝littlesome@uwa問答社群提供了回答

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

官網:www.uwa4d.com

官方技術部落格:blog.uwa4d.com

官方問答社群:answer.uwa4d.com

uwa學堂:edu.uwa4d.com

官方技術qq群:793972859(原群已滿員)

最大面積問題 LargestReactangle

描述 在下列非負陣列中找出最大面積 heigh 0,2,1,3,4,3,2,0 若干非負陣列組成面積不同的矩形,求上述中的最大面積。在圖中畫出了下標 3 5 高度為3,面積為9的矩形和下標為 1 6 高度為1面積為6的矩形。思路 暴力遍歷 1 從下標i開始,對於每乙個高度heigh i h,向左遍歷...

10 18 最大面積 2432

學過初三數學或圓的相關知識的人都會求陰影部分面積。垂徑定理和勾股定理 s陰 a r2 1 2 a 2 b r 2 1 2 b 2 a b 然後就可以列舉a,b找最大值 a,b 2r var r,a,b,i,j longint c,max,b1,a1 double begin readln r for...

島嶼的最大面積

給定乙個包含了一些 0 和 1的非空二維陣列 grid 乙個 島嶼 是由四個方向 水平或垂直 的 1 代表土地 構成的組合。你可以假設二維矩陣的四個邊緣都被水包圍著。找到給定的二維陣列中最大的島嶼面積。如果沒有島嶼,則返回面積為0。示例 1 0,0,1,0,0,0,0,1,0,0,0,0,0 0,0...