echart 实例显示位置_技术分享:如何在Unity中使用实例化渲染?
生活随笔
收集整理的這篇文章主要介紹了
echart 实例显示位置_技术分享:如何在Unity中使用实例化渲染?
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
編者按?在日常開發中,通常說到優化、提高幀率時,總是會提到批量渲染。之前簡單總結了靜態合批(點此查看全文)以及動態合批(點此查看全文),這次作者將和大家聊聊實例化渲染。
作者:枸杞憂天
(本文內容由公眾號“偶爾學學Unity”提供,轉載請征得同意。文章僅為作者觀點,不代表GWB立場)
當我們想要呈現這樣的場景:一片茂密的森林、廣闊的草原或崎嶇的山路時,會發現在這些場景中存在大量重復性元素:樹木、草和巖石。
仙境怕是也不過如此吧它們都使用了相同的模型,或者模型的種類很少,比如:樹可能只有幾種;但為了做出差異化,它們的顏色略有不同,高低參差不齊,當然位置也各不相同。使用靜態合批來處理它們(假設它們都沒有動畫),是不合適的。因為數量太多(林子大了,多少樹都有),所以合并后的網格體積可能非常大,這會引起內存的增加;而且,這個合并后的網格還是由大量重復網格組成的,不劃算。使用動態合批來處理他們,雖然不會“合并”網格,但是仍然需要在渲染前遍歷所有頂點,進行空間變換的操作;雖然單顆樹、石頭的頂點數量可能不多,但由于數量很多,所以也會在一定程度上增加CPU性能的開銷,沒必要。那么,對于場景中這些模型重復、數量多的渲染需求,有沒有適合的批處理策略呢?有吧,實例化渲染就是為了解決這樣的問題。實例化渲染,是通過調用“特殊”的渲染接口,由GPU完成的“批處理”。它與傳統的渲染方式相比,最大的差別在于:調用渲染命令時需要告知GPU這次渲染的次數(繪制N個)。當GPU接到這個命令時,就會連續繪制N個物體到我們的屏幕上,其效率遠高于連續調用N次傳統渲染命令的和(一次繪制一個)。舉個例子,假設希望在屏幕上繪制出兩個顏色、位置均不同的箱子。如果使用傳統的渲染,則需要調用兩次渲染命令(DrawCall = 2),分別為:畫一個紅箱子 和 畫一個綠箱子。兩個顏色、位置各異的箱子如果使用實例化渲染,則只需要調用一次渲染命令(DrawCall = 1),并且附帶一個參數2(表示繪制兩個)即可。當然,如果只是這樣,那GPU就會把兩個箱子畫在相同的位置上。所以我們還需要告訴GPU兩個箱子各自的位置(其實是轉換矩陣)以及顏色。這個位置和顏色我們會按照數組的方式傳遞給GPU,大概這個樣子吧:分別傳遞保存位置和顏色的數組那接下來GPU在進行渲染時,就會在渲染每一個箱子的時候,根據當前箱子的索引(第幾個),拿到正確的屬性(位置、顏色)來進行繪制了。一個簡單的實例化渲染流程我們通過一個簡單的場景,來看一下Unity為實例化渲染做了什么。實例化渲染兩個彩色箱子顏色屬性通過MaterialPropertyBlock傳入通過GPA觀察Unity做了什么。GPA中的VertexBuffer和IndexBuffer中的信息注:Unity默認Cube網格,包含24個頂點和36個索引。頂點緩沖區Size = (Position(float3)
+ Normal(float3)
+ Tangent(float4)
+ TexCoord(float2)
+ TexCoord1(float2)) x 24 = 1344Byte
索引緩沖區Size = Index(ushort) x 36 = 72Byte
總結
以上是生活随笔為你收集整理的echart 实例显示位置_技术分享:如何在Unity中使用实例化渲染?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win10安装ensp启动40_acer
- 下一篇: 图像归一化处理 相同像素_图像处理学习笔