最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

性能調(diào)優(yōu)技術(shù)集錦

2023-05-06 17:18 作者:游戲開發(fā)RAIN  | 我要投稿

性能調(diào)優(yōu),一直是游戲上線之前的很重要的一個環(huán)節(jié), 游戲幀率過低,手機發(fā)燙, 低端機上跑不起來等, 這些都需要來做優(yōu)化,今天我們來給大家分享Unity做性能調(diào)優(yōu)的常用技術(shù)手段。

?

性能調(diào)優(yōu)的指導(dǎo)思想

?

接觸過很多剛做性能調(diào)優(yōu)的小伙伴,他們做性能調(diào)優(yōu)最大的問題就是缺乏一個做性能優(yōu)化的指導(dǎo)思想, 導(dǎo)致很多想法做法,很片面,優(yōu)化的效果也不好。要做性能調(diào)優(yōu),先來說說性能調(diào)優(yōu)的指導(dǎo)思想。性能調(diào)優(yōu)首先要分析問題,定位問題,證明是這塊問題后再著色優(yōu)化與想解決對策。

大家可以回想一下,多少次幀率低的時候,你的第一時間就是去查Drawcall, 去優(yōu)化降低Drawcall,今天這個指導(dǎo)思想告訴我們,做性能優(yōu)化之前,我們先定位,證明確實是Drawcall的問題導(dǎo)致性能下降。如何來定位問題,找出引起問題的代碼和節(jié)點呢?這些給大家介紹一些方法。

?

(1)對比法

例如, 剛開始的時候幀率是60FPS,同一個場景運行一段時間以后是30FPS,如何優(yōu)化,像這種符合很明顯的對比場景,我們可以通過前后對比,來找出60FPS,30FPS,最大的變化。一般可以通過打開stats, 來觀察前后主要的變化,main thread耗時,render thread耗時, 三角形面數(shù),內(nèi)存等信息,看看前后明顯發(fā)生的變化??吹綌?shù)據(jù)變化以后,再來思考整個過程中可能出現(xiàn)的問題,然后再證明, 再想優(yōu)化對策。

?

(2)隔離法

這個是我經(jīng)常用的一個方法, 就是隔離可疑區(qū)域和代碼,然后比較,逐步排查,縮小問題范圍。隔離法其實是非常好的方法,看上去很笨,很慢,但其實效率遠比你想像的要好。比如,場景的物體過多,這個問題,那么我就可以采取隔離方法,先減少掉一倍,看效果。某個代碼引發(fā)了幀率下降,可以逐步的注釋掉代碼,來觀察結(jié)果,隔離的時候,可以采用二分查找,一半一半的排查。排查范圍很快被縮小,問題也就精確的定位了。

?

(3)反經(jīng)驗法

上面介紹了常用的兩種方法,定位問題,還有其他的一些方法,但是我想再說一個最重要的就是反經(jīng)驗法。你沒看錯,反經(jīng)驗,在性能優(yōu)化的時候,不要相信經(jīng)驗,一步一步的逐步分析,有條不穩(wěn)。不管什么問題,按部就班,不要根據(jù)經(jīng)驗,武斷的下結(jié)論,要嚴格證明問題所在后再動手, 很多小伙伴遇到性能問題后,把問題簡單的描述一下,去請教一個經(jīng)驗豐富的人,問他可能是哪方面的問題,我想說這種方式是很難做好你項目的性能優(yōu)化的,項目和項目都不一樣,連具體的問題都沒有定位,你去請教經(jīng)驗豐富的老者,從老者的角度來說也無法幫到你。不要迷信經(jīng)驗,在動手前一定要定位好誰的問題,然后才能針對具體問題下對策。

?

優(yōu)化從架構(gòu)設(shè)計開始, 盡早驗證核心玩法性能

好的框架設(shè)計,不僅讓大家能很好的在一起工作,同時更方便我們快速的反應(yīng)和定位問題。你的項目不好定位問題,那么一定是框架設(shè)計做的不好。所以開始做項目的時候,框架設(shè)計要花點時間,模塊盡可能的獨立,模塊入口盡量清晰,整個框架設(shè)計能很好的隔離錯誤的蔓延。資源視圖與邏輯代碼分離,游戲數(shù)據(jù)與代碼邏輯分離。這些都有助于快速的定位問題,比如我要驗證是否物體過多,導(dǎo)致性能問題,只要在表格上配置一下,少放一些物體就可以驗證,如果覺得是某個功能,倒是消耗CPU,可以把物體的這個功能的組件,關(guān)閉或不添加,比如懷疑怪物AI,可以注釋掉添加怪物AI的組件。好的框架設(shè)計,定位問題的時候,就變得非常簡單。如果是ECS框架,定位問題會更加接單,內(nèi)存看Entity與資源,算法性能看System與物體規(guī)?!?/p>

接下來要給大家介紹的是我認為最重要的經(jīng)驗,就是盡早的驗證核心玩法極限時候的性能開銷與測試。不要等游戲項目做完了,才去驗證,在設(shè)計初期驗證完成后,一些性能問題會導(dǎo)致我們修改規(guī)格,修改玩法, 把這些問題越早摸清楚,是確保整個項目成功上線的關(guān)鍵。每個禮拜,建議把項目在不同的平臺上測試,嚴格監(jiān)測性能問題,哪個禮拜出現(xiàn)性能問題了,馬上可以回溯復(fù)盤數(shù)據(jù),著手摸清楚并解決。

?

Unity 性能優(yōu)化方法集錦

1:包體體積優(yōu)化:

聲音文件優(yōu)化: 將wav,壓縮成mp3或ogg, 最好是ogg,沒有版權(quán)問題, 將多聲道變成單聲道。改變聲音的采樣率與碼率,減少聲音文件體積。

貼圖文件大小優(yōu)化: 將png轉(zhuǎn)jpg, 并使用圖片壓縮軟件,壓縮貼圖體積, 盡量減少圖片數(shù)目,復(fù)用圖片,盡量能使用顏色等代碼的方式來代替貼圖。

3D模型文件: 根據(jù)需求適當降低模型面數(shù), 去掉多余不用的數(shù)據(jù), 可以通過法線貼圖,高度貼圖等降低模做出高模的效果, 合并貼圖通道數(shù)據(jù)(PBR工作流中,將金屬度,粗糙度,環(huán)境遮擋放一個紋理里面, 將數(shù)據(jù)合并到貼圖不用的通道,比如Albedo貼圖,Alpha通道不用,就可以存放環(huán)境遮擋等,節(jié)約貼圖數(shù)目)

將資源ab包化: 把所有的資源分成一個一個的ab包,ab包本省有壓縮功能,這樣整體的包體也會減小,如果可能,可以把ab包全部放服務(wù)器,第一次運行游戲的時候再下載,比如《王者榮耀》,來節(jié)省包體體積。

?

2: 骨骼動畫優(yōu)化:

3D游戲中骨骼動畫也是非常消耗性能的地方,因為每幀,我們都要通過動畫組件采樣,采樣后重新計算出來我們的頂點的位置,傳給GPU的渲染管線來處理, 我們可以將骨骼動畫的每幀頂點的位置緩存到一個紋理貼圖里面,用空間換時間的方式來節(jié)約動畫組件的開銷,并嘗試合并Drawcall。

?

3: LOD的優(yōu)化:

對于大規(guī)模多角色的場景游戲,我們要開啟LOD,讓遠處的問題用盡量少的面,近處的物體用更多的面。

?

4: 模型細節(jié)增強,提升計算性能:

使用法線貼圖,高度貼圖等細節(jié)增強手段來降低模型的面數(shù)同時,能獲得和高模同樣的細節(jié)和更好的計算性能。

?

5: 光照優(yōu)化:

靜態(tài)光照烘焙+反射探頭來做更好的場景效果,代替實時的光照計算,減少光源的數(shù)目。對于一些物體的發(fā)光特效,可以通過shader來實現(xiàn),而不用加光源。定制Shader,可以將逐像素光照改為逐頂點光照,節(jié)約逐像素光照的計算開銷。

?

6: SetPassCall與Drawcall優(yōu)化

SetPassCall: 通俗的講解就是更換重新裝在渲染管線里面的Shader代碼和配置,就像換畫筆一樣的。SetPassCall開銷非常的大,所以盡可能的要少用一些不同的Shader,再一個場景里面。盡可能的讓同一個Shader 繪制最多的物體后再切換下一個Shader。盡量避免繪制物體的時候平凡交叉的來回切換Shader來節(jié)約SetPassCall的次數(shù)。

Drawcall 優(yōu)化,其實很簡單三種優(yōu)化手段,靜態(tài)合批,動態(tài)合批,GPU Instancing合批, 然后我們針對合批的條件去達成對應(yīng)的條件就可以了,比如,我們做一個捕魚達人3D游戲,我們有很多的魚,可以把魚的所有紋理貼圖,放到一個大圖里面,這樣,這些魚就是同樣的Shader,同樣的紋理貼圖對象,就可以達到合批的條件而做到合批, 節(jié)約Drawcall。

?

7: 物理引擎的優(yōu)化:

能不用物理引擎的游戲,盡量不用物理引擎,能用代碼自己實現(xiàn)的盡量用代碼自己實現(xiàn),因為物理引擎的開銷畢竟擺在那里了, 用了代碼很簡單,但是性能開銷也不可忽視。有一些不是真正的物理游戲,比如Moba類的游戲,防止物體穿透等,其實我們可以不用物理引擎,通過制作地圖格子的方式,標記障礙物,自己控制的時候,如果進入障礙物的標記,就不讓他更新即可,這些可以替換物理引擎獲得很好的性能效果。常用的有菱形的地圖格子與六邊形的地圖格子。

暫時不用的剛體,或者不在視線范圍內(nèi)的剛體可以根據(jù)游戲的需要,來顯示和隱藏,達到節(jié)約物理引擎計算的目的。修改物理引擎全局的迭代參數(shù),獲得實用性的同時又有更好的性能。了解物理碰撞器的性能開銷,球體最小,網(wǎng)格碰撞器最大,盡量使用開銷小的碰撞器, 對于靜態(tài)物體,能夠合并物理碰撞器的盡量用一個物理碰撞器。

?

8: 陰影的優(yōu)化:

通過開關(guān)控制陰影,在低端機上關(guān)閉陰影獲得更好的運行幀率,在高端機上開啟獲得更好的運行效果。通過偽陰影技術(shù)來做貼圖,節(jié)約陰影計算的開銷, 可以自己定制Shader來實現(xiàn)高性能的陰影效果。

?

9: Shader優(yōu)化:

減少Shader中的條件判斷和展開循環(huán),來獲得更好的指令緩沖cache 命中率, 減少一些復(fù)雜的計算,可以采用一些空間換時間的方法來緩存計算結(jié)果。逐頂點計算來替代逐片元的計算,減少計算次數(shù)??梢园裇hader 設(shè)置為常駐內(nèi)存緩存,這樣節(jié)約SetPassCall所帶來的開銷。

?

10: C#編寫代碼的習(xí)慣

Update里面盡量不要使用GetComponent, Find等,可以在初始化的時候先找出來,然后在Update里面使用, 能不放FixedUpdate盡量不放FixedUpdate, 這樣低端機上能節(jié)約計算次數(shù)。

能降低FixedUpdate計算時間間隔的,盡量減少計算時間間隔,能減少計算的次數(shù)。寫代碼的平常的一些規(guī)范就不說了,避免大量的new 對象。一些重復(fù)使用的對象,可以通過節(jié)點池等原理先緩存起來??梢圆捎枚嗑€程來做一些計算避免卡住游戲線程導(dǎo)致幀率下降。不要再游戲住線程里面直接做同步的IO以免卡住游戲線程,導(dǎo)致幀率下降,從開始寫代碼起,要把每行代碼寫好,長期的堅持積累,才能形成良好的代碼習(xí)慣寫出高性能的代碼,最重要的是學(xué)好數(shù)據(jù)結(jié)構(gòu)與算法等基礎(chǔ)知識,好的算法是好性能的關(guān)鍵。

?

還有很多的一些方面,我這邊可能有遺漏的,大家可以留言討論,后續(xù)如果有重要的我還會再更新。


性能調(diào)優(yōu)技術(shù)集錦的評論 (共 條)

分享到微博請遵守國家法律
湘西| 玛多县| 蒲城县| 富阳市| 海原县| 肇庆市| 隆林| 来宾市| 广丰县| 响水县| 昌黎县| 铁力市| 华坪县| 平度市| 疏附县| 洛南县| 焦作市| 沙河市| 盐源县| 新民市| 崇信县| 怀仁县| 唐河县| 班玛县| 仁化县| 达孜县| 西宁市| 阳曲县| 泰兴市| 原阳县| 陆河县| 剑川县| 日土县| 略阳县| 西乡县| 林州市| 新泰市| 开化县| 达拉特旗| 大城县| 青龙|