Unity 2017 Game Optimization 读书笔记 Dynamic Graphics (3)
Rendering performance enhancements
Enable/Disable GPU Skinning
開啟GPU Skinning可以減輕CPU或GPU中Front End部分中某一個(gè)的負(fù)擔(dān),但是會(huì)加重另一個(gè)的負(fù)擔(dān)。Skinning是mesh中的頂點(diǎn)根據(jù)動(dòng)畫中骨骼的當(dāng)前位置進(jìn)行計(jì)算,從而讓角色擺出正確的姿勢。
頂點(diǎn)的計(jì)算過程可以放在CPU也可以放在GPU的Front End 部分,取決于是否開啟GPU Skinning。可以通過?Edit | Project Settings | Player Settings | Other Settings | GPU Skinning 設(shè)置。
開啟后,計(jì)算會(huì)放在GPU的Frond End中,但是CPU并不是一點(diǎn)工作都不做了,還是需要傳輸數(shù)據(jù)到GPU并且要在Command Buffer中生成指令。如果不開啟,則計(jì)算在CPU中完成,傳輸?shù)紾PU中的數(shù)據(jù)已經(jīng)是計(jì)算好的頂點(diǎn)數(shù)據(jù)。所以根據(jù)CPU和GPU的狀態(tài)可以靈活決定應(yīng)該在哪算,如果CPU負(fù)擔(dān)太重就開啟,把工作丟給GPU。
Reduce geometric complexity
這條跟GPU中的Font End相關(guān)。很多時(shí)候用不到需要多套無用UV和法線數(shù)據(jù)的mesh。盡量減少頂點(diǎn)數(shù)量,有三種途徑:
1. 讓美術(shù)老鐵們手動(dòng)減少頂點(diǎn)數(shù)量重新生成mesh
2. 干脆從場景里刪掉,當(dāng)然這是最壞情況
3. 使用LOD等技術(shù)自動(dòng)對mesh進(jìn)行culling
Reduce Tessellation
通過Geometry Shaders中使用Tessellation技術(shù)會(huì)帶來很大的體驗(yàn)提升,但是也給GPU中Frond End增加了負(fù)擔(dān)。目前對于如和優(yōu)化Tessellation也沒啥好辦法,還是盡量優(yōu)化Frond End中其他地方給Tessllation省出更多空間吧。
Employ GPU Instancing
GPU Instancing比Dynamic Batching更高效,因?yàn)樗⒉恍枰猰esh的合并,但是也要求更嚴(yán)格,material引用和mesh必須都一致才可以。GPU Instancing可以有效的減少Draw Call,但是它在Unity中默認(rèn)是沒有被開啟的,在每個(gè)material中可以設(shè)置是否開啟。
-
Unity automatically picks MeshRenderer components and?Graphics.DrawMesh?calls for instancing. Note that?SkinnedMeshRenderer?is not supported.
-
Unity only batches GameObjects that share the same Mesh and the same Material in a single GPU instancing draw call. Use a small number of Meshes and Materials for better instancing efficiency. To create variations, modify your shader?scripts
?to add per-instance data (see next section to learn more about this).
https://docs.unity3d.com/Manual/GPUInstancing.html
Use mesh-based Level Of Detail(LOD)
LOD就是根據(jù)物體和攝像機(jī)的距離不同可以自動(dòng)使用不同精度的mesh,因?yàn)榫嚯x很遠(yuǎn)的地方根本沒必要用精度很高的模型。
LOD的缺點(diǎn)之一是開發(fā)起來比較費(fèi)勁,會(huì)需要美術(shù)提供不同精度的模型,場景設(shè)計(jì)師需要生成LOD Groups,還要進(jìn)行測試效果,這會(huì)花費(fèi)很多時(shí)間,當(dāng)然目前一些插件提供了自動(dòng)生成LOD Mesh的功能。
LOD另一個(gè)缺點(diǎn)是需要消耗更多的磁盤和內(nèi)存以及CPU,但是優(yōu)點(diǎn)也非常明顯,就可以有效減少頂點(diǎn)數(shù)量,降低Draw Call和Fill Rate以及 Memory Bandwidth。
LOD也不是總適用,對于內(nèi)景以及攝像機(jī)是從上往下俯角的游戲,比如RTS和MOBA類游戲,物體和攝像機(jī)的距離基本都一致,所以LOD根本不會(huì)起到什么效果。
總之是否使用LOD需要視情況而定,如果性能并沒有出現(xiàn)瓶頸,沒有必要使用。
Culling Groups
通過腳本,可以自定義LOD系統(tǒng),比如可以根據(jù)distance使用不同精度的動(dòng)畫,使用不同的shader以及粒子特效等。當(dāng)然使用Culling Gropus也會(huì)帶來開發(fā)上額外的工作量。https://docs.unity3d.com/Manual/CullingGroupAPI.html
Make use of Occlusion Culling
同時(shí)能降低Fill Rate和Overdraw最好的途徑之一就是使用Occlusion Culling(遮擋剔除)。Frustum Culling(視錐剔除)只能剔除掉攝像機(jī)外的物體,但是對于攝像機(jī)內(nèi)的物體,常規(guī)渲染的順序是從遠(yuǎn)到近,因此當(dāng)近物體擋住了遠(yuǎn)處物體時(shí),就會(huì)產(chǎn)生OverDraw。
沒有遮擋剔除時(shí),遠(yuǎn)處物體也會(huì)被渲染????
Occlusion Culling可以有效剔除攝像機(jī)內(nèi)被近處物體擋住的部分。Unity把場景切割成cells,在Editor中烘焙生成Cells間遮擋剔除關(guān)系的數(shù)據(jù),在運(yùn)行時(shí),加載烘焙好的數(shù)據(jù)到內(nèi)存中,對于設(shè)置了遮擋剔除的攝像機(jī),就會(huì)根據(jù)這個(gè)數(shù)據(jù)來進(jìn)行渲染。
使用遮擋剔除時(shí),遠(yuǎn)處物體會(huì)被剔除掉????
只有標(biāo)記為Occluder Static 或者?Occludee Static的物體可以產(chǎn)生遮擋剔除數(shù)據(jù)。對于普通物體,既能遮擋其他物體又能被其他物體遮擋,使用Occluder。對于透明物體,并不能遮擋其他物體,使用Occludee。
開啟Occlusion Culling會(huì)增加存儲(chǔ)空間和內(nèi)存以及CPU的開銷,因此對于Occlusion Culling烘焙時(shí)要設(shè)置合適的Cell參數(shù)。
特別注意的是即使物體被Occlusion Culling剔除掉了,但是它的陰影依然會(huì)被渲染。
Optimizing Particle Systems
粒子系統(tǒng)中,要注意粒子生成的數(shù)量以及使用Shader的復(fù)雜度,粒子的數(shù)量會(huì)影響Front End,而shader中使用大量的Texture會(huì)
在Back End消耗Fill Rate和Memory Bandwidth。
最直接的優(yōu)化方法就是減少粒子數(shù)量和減少特效數(shù)量,使用圖集也是優(yōu)化方法之一。但是經(jīng)常忽略的一個(gè)優(yōu)化方法是使用Particle System Culling。
Make use of Particle System Culling
關(guān)于 Particle System Culling 的一篇blog:https://blogs.unity3d.com/2016/12/20/unitytips-particlesystem-performance-culling/.
Particle System Culling的基本原理就是是否可以預(yù)測,如果一個(gè)粒子特效的各種參數(shù)設(shè)置使得其行為樣式時(shí)可以被預(yù)測的,當(dāng)它并不在視野中時(shí)就可以自動(dòng)的被剔除掉,當(dāng)重新進(jìn)入視野中時(shí),因?yàn)槭强梢灶A(yù)測的,所以可以計(jì)算出此時(shí)此刻應(yīng)有的樣子。
但是一些設(shè)置可能會(huì)導(dǎo)致粒子系統(tǒng)變得不可預(yù)測或者非程序化,那就無法使用Particle System Culling,無論是否可見,粒子系統(tǒng)必須一直保持運(yùn)行。比如Particle System 使用world-space坐標(biāo),使用碰撞,或者復(fù)雜的動(dòng)畫曲線等等,都可能會(huì)使得其不可預(yù)測。Unity提供了一個(gè)非常有用的Warning,來提示改設(shè)置是否會(huì)導(dǎo)致粒子系統(tǒng)無法自動(dòng)?Culling。
?Avoid recursive Particle System calls
?Particle System中很多方法都是遞歸的,調(diào)用他們會(huì)遍歷每一個(gè)child并且調(diào)用?GetComponent<ParticleSystem>()函數(shù),當(dāng)層級非常復(fù)雜時(shí),會(huì)有比較大的開銷。
?Start(), Stop(), Pause(), Clear(), Simulate(), and isAlive()都是這種函數(shù)。但是這些函數(shù)里其實(shí)有個(gè)withChildren參數(shù),Unity默認(rèn)設(shè)置為true,如果手動(dòng)設(shè)置為false,就可以避免遞歸行為。
?
總結(jié)
以上是生活随笔為你收集整理的Unity 2017 Game Optimization 读书笔记 Dynamic Graphics (3)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sql server数据库中 small
- 下一篇: Unity 2017 Game Opti