千牛網(wǎng)站上的店鋪推廣怎么做福州整站優(yōu)化
性能優(yōu)化是游戲項(xiàng)目開發(fā)中一個(gè)重要環(huán)節(jié)。游戲幀率過(guò)低,手機(jī)發(fā)燙, 包體太大,低端機(jī)上跑不起來(lái)等, 這些都需要來(lái)做優(yōu)化,不管過(guò)去,現(xiàn)在,未來(lái),性能優(yōu)化都是永恒的話題。
而性能優(yōu)化首先要掌握的是性能分析,通過(guò)分析才能發(fā)現(xiàn)問(wèn)題所在。性能分析對(duì)于游戲開發(fā)是必備的,通過(guò)性能分析工具可以給我們提供游戲性能表現(xiàn)的詳細(xì)信息。如果我們的游戲存在性能問(wèn)題,如低幀率或者高內(nèi)存占用,性能分析工具可以幫助我們發(fā)現(xiàn)問(wèn)題的起因,并協(xié)助我們解決問(wèn)題。
?
開始之前,有關(guān)性能分析需要了解的概念:
FPS(幀率)
FPS是衡量游戲性能的基本指標(biāo)。在游戲中,一幀類似于動(dòng)畫中的一幀,FPS是指游戲運(yùn)行時(shí)每秒所運(yùn)行的幀數(shù),也可以理解為每秒渲染的畫面數(shù)。
通常FPS越高,表明游戲性能運(yùn)行越好,對(duì)于大多數(shù)當(dāng)前游戲的目標(biāo)是幀率60FPS,通常來(lái)說(shuō),幀率在30FPS以上是可以接受的,特別是移動(dòng)游戲,或者不需要快速反應(yīng)互動(dòng)的游戲,對(duì)于在VR游戲中,則至少需要90FPS。
實(shí)際上FPS并不是衡量游戲穩(wěn)定體驗(yàn)的理想指標(biāo)??紤]以下情況:在運(yùn)行時(shí)的前0.75s內(nèi)渲染了59幀。然后接下來(lái)的1幀需要0.25s才能渲染完畢。雖然是60fps,但實(shí)際上會(huì)讓玩家感覺卡頓。對(duì)于我們來(lái)說(shuō)更有用的是渲染一幀需要多少毫秒。
渲染一幀,Unity必須執(zhí)行很多不同的任務(wù)。簡(jiǎn)單的說(shuō),Unity必須更新游戲的狀態(tài),獲取游戲的快照并且把快照畫到屏幕上。有一些任務(wù)是在每一幀都執(zhí)行的,包括讀取用戶輸入,執(zhí)行腳本,運(yùn)行光照計(jì)算等。除此之外,有許多操作是在一幀執(zhí)行多次的,例如物理運(yùn)算。當(dāng)所有這些任務(wù)都執(zhí)行的足夠快時(shí),我們的游戲才會(huì)有穩(wěn)定且可接受的幀率。當(dāng)這些任務(wù)執(zhí)行的不夠快時(shí),渲染一幀將花費(fèi)太長(zhǎng)的時(shí)間,并且?guī)蕰?huì)因此下降。
知道哪些任務(wù)花費(fèi)了太長(zhǎng)的時(shí)間執(zhí)行,對(duì)于我們?cè)鯓尤ソ鉀Q性能問(wèn)題是十分關(guān)鍵的。一旦我們知道了哪些任務(wù)降低了幀率,我們就可以嘗試去優(yōu)化游戲的那一部分。這就是為什么性能分析工具這么關(guān)鍵:性能分析工具告訴我們?cè)谝粠忻總€(gè)任務(wù)花費(fèi)了多長(zhǎng)時(shí)間。
VSync(垂直同步)
VSync將應(yīng)用程序的幀率與顯示器的刷新速率同步。這意味著,如果您有一個(gè)60Hz的顯示器,并且游戲的幀預(yù)算在16.66ms內(nèi),則它會(huì)強(qiáng)制以60fps運(yùn)行,而不允許更快。將幀率與顯示器的刷新速率同步,可以減輕GPU的負(fù)擔(dān)并解決屏幕撕裂等視覺圖像瑕疵。在Unity中,通過(guò)Quality settings 可以設(shè)置VSync Count (Edit > Project Settings > Quality)。
QualitySettings.vSyncCount有三種選項(xiàng)
- Don't Sync(不同步)?
- Every V Blank(每一個(gè)垂直同步)?
- Every Second V Blank(每一秒的垂直同步)?
移動(dòng)平臺(tái)忽視 QualitySettings.vSyncCount。僅使用 Application.targetFrameRate 控制幀率。移動(dòng)平臺(tái)的最大幀率就是屏幕的刷新率,移動(dòng)平臺(tái)上的默認(rèn)幀率通常為每秒 30 幀。
垂直同步對(duì) FPS 的影響
我們平時(shí)用的電腦顯示器,一般屏幕的刷新率都是80HZ上下,那么顯卡會(huì)按照每秒80HZ來(lái)發(fā)送一個(gè)垂直同步信號(hào)。
- 開啟垂直同步:顯卡繪制完一屏圖像后,需要等待80HZ垂直同步信號(hào)的到達(dá),才可以開始繪制下一屏。這樣游戲自然受到刷新率運(yùn)行的制約。
- 關(guān)閉垂直同步:那么游戲中顯卡繪制完一屏圖像后,顯卡和顯示器無(wú)需等待垂直同步信號(hào)達(dá)到,就可以開始下一屏的繪制,展示了顯卡的實(shí)力。
但是不要忘記,正是因?yàn)榇怪蓖降拇嬖?#xff0c;才能使得游戲進(jìn)程和顯示器刷新率同步,使得畫面更加平滑和穩(wěn)定。取消了垂直同步信號(hào),固然可以換來(lái)更快的速度,但是在圖像的連續(xù)性上勢(shì)必打折扣。這也正是很多朋友抱怨關(guān)閉垂直后發(fā)現(xiàn)畫面不連續(xù)的理論原因。
?
Unity Profiler
Profiler是Unity內(nèi)置的強(qiáng)大的性能分析工具,通過(guò)Profiler,我們可以了解到cpu使用情況,gpu使用情況,渲染,內(nèi)存使用情況,聲音,物理,網(wǎng)絡(luò),UI等等。還可以進(jìn)行錄制數(shù)據(jù),分析每幀的運(yùn)行情況??梢栽赨nity Editor中進(jìn)行分析,也可以在目標(biāo)平臺(tái)上分析,連接真機(jī),真實(shí)了解游戲運(yùn)行情況。
The CPU usage profiler
當(dāng)我們查看Profiler窗口的上部時(shí),可以看到完成每幀的任務(wù)花費(fèi)了多少cpu時(shí)間。
在CPU usage左側(cè),可以看到不同顏色的分類塊,可以點(diǎn)擊顯示隱藏你感興趣的分類,右側(cè)顯示各分類的耗時(shí),可以根據(jù)顏色塊的大小清晰的了解性能的瓶頸所在。最下面可以詳細(xì)的了解所有任務(wù)的耗時(shí),可以精確到各大個(gè)函數(shù)的耗時(shí),可以根據(jù)排序快速定位問(wèn)題所在,也可以搜索你關(guān)心的函數(shù)。
渲染分析
渲染是導(dǎo)致性能問(wèn)題的常見原因。在嘗試修復(fù)渲染問(wèn)題前,確定是CPU受限還是GPU受限非常重要,這些情況需要不同的解決方法。 簡(jiǎn)單來(lái)說(shuō),CPU負(fù)責(zé)確定必須繪制什么,GPU負(fù)責(zé)繪制它。
如果游戲中因?yàn)镃PU執(zhí)行渲染任務(wù)耗時(shí)太久而導(dǎo)致幀渲染時(shí)間過(guò)長(zhǎng),我們稱其為 CPU受限(CPU Bound)。
如果游戲中因?yàn)镚PU執(zhí)行渲染任務(wù)耗時(shí)太久而導(dǎo)致幀渲染時(shí)間過(guò)長(zhǎng),我們稱其為 GPU受限(GPU Bound)。
GPU受限
通過(guò)GPU usage快速地判斷游戲是否GPU受限。但并非所有設(shè)備和驅(qū)動(dòng)程序都支持此分析器。在檢查GPU受限之前,需要先檢查GPU usage是否適用于我們的目標(biāo)設(shè)備。如果添加GPU usage后有數(shù)據(jù)意味目標(biāo)設(shè)備支持GPU usage。
如果GPU時(shí)間超過(guò)CPU時(shí)間,可以確定在該點(diǎn)上已經(jīng)GPU受限。
如果目標(biāo)硬件不支持GPU usage,仍然可以確定游戲是否GPU受限。可以通過(guò)觀察CPU使用情況來(lái)判斷。如果發(fā)現(xiàn)CPU正在等待GPU完成其任務(wù),這意味著游戲GPU受限。
如果主線程在Profiler標(biāo)記(例如Gfx.WaitForPresentOnGfxThread)中花費(fèi)大量時(shí)間,而渲染線程同時(shí)顯示Gfx.PresentFrame或<GraphicsAPIName>.WaitForLastPresent等標(biāo)記,則應(yīng)用程序出現(xiàn)了GPU受限。
CPU受限
如果尚未確定性能問(wèn)題的原因,我們繼續(xù)分析基于CPU的渲染問(wèn)題。
點(diǎn)擊選擇CPU usage。
在分析器窗口的頂部,CPU usage顯示其隨時(shí)間變化的數(shù)據(jù)。查看表示渲染的圖表中的彩色部分??梢酝ㄟ^(guò)在關(guān)鍵字中單擊名稱旁邊的彩色方塊來(lái)隱藏或顯示圖表中的數(shù)據(jù)。
如果一幀中大部分時(shí)間由渲染所占用,這表明渲染可能是問(wèn)題的原因??梢酝ㄟ^(guò)以下步驟深入分析數(shù)據(jù)來(lái)確認(rèn):
查看分析器窗口底部顯示當(dāng)前選定幀和分析器詳細(xì)信息的區(qū)域。
在該區(qū)域左上角的下拉菜單中選擇“Hierarchy”。
選擇“Time ms”列,按時(shí)間(毫秒)對(duì)函數(shù)進(jìn)行排序。
單擊列表中的頂部函數(shù)進(jìn)行選擇。
如果選定的函數(shù)是渲染函數(shù),CPU分析器圖表將通過(guò)Rendering進(jìn)行突出顯示。這種情況意味著與渲染相關(guān)的操作導(dǎo)致性能問(wèn)題,此時(shí)游戲處于CPU受限狀態(tài)。請(qǐng)注意函數(shù)名稱和執(zhí)行函數(shù)的線程,這些信息將在修復(fù)問(wèn)題時(shí)很有用。?
解決GPU受限時(shí)的渲染問(wèn)題
優(yōu)化填充率
填充率指GPU每秒能夠渲染的屏幕像素?cái)?shù)量,它是引起GPU的性能問(wèn)題的最常見因素,尤其是在移動(dòng)設(shè)備上。
填充率相關(guān)的優(yōu)化手段:
- 優(yōu)化片元著色器(Fragment Shader)
- 減少重繪(Overdraw)
- 優(yōu)化減少后處理(Image Effects)
優(yōu)化顯存帶寬(Memory Bandwidth)
顯存帶寬指GPU對(duì)其專用的內(nèi)存的讀寫速率。如果游戲出現(xiàn)帶寬受限,通常是因?yàn)槭褂昧颂蟮募y理(Texture)。
優(yōu)化頂點(diǎn)處理(Vertex Processing)
頂點(diǎn)處理指GPU渲染Mesh中的每個(gè)頂點(diǎn)使所做的工作。頂點(diǎn)處理的開銷與兩個(gè)因素有關(guān):需要進(jìn)行渲染的頂點(diǎn)的數(shù)量和對(duì)每個(gè)頂點(diǎn)所要進(jìn)行的操作。
降低屏幕渲染分辨率,通常這是有效的手段。也可以通過(guò)此方法來(lái)檢驗(yàn)是否GPU受限。
解決CPU受限時(shí)的渲染問(wèn)題
向GPU發(fā)送指令的時(shí)間開銷是引起CPU Bound的最常見原因,向GPU發(fā)送指令的過(guò)程中,開銷最大的操作是SetPass Call。
通常,有3種 降低Batch和SetPass Call數(shù)目的方法:
- 降低需要渲染的對(duì)象的數(shù)量,可以同時(shí)減少Batch和SetPass Call。
- 降低每個(gè)對(duì)象需要被渲染的次數(shù),可以減少SetPass Call。
- 將對(duì)象合并到更少的批處理當(dāng)中,可以減少Batch。
CPU與GPU并不各自孤立:
如果 CPU 在物理計(jì)算和腳本運(yùn)行要花很多時(shí)間,那么即使 Shader 優(yōu)化得再好,也不會(huì)提高幀率;
如果 GPU 處理 Shader 消耗大量時(shí)間,那么即使優(yōu)化物理系統(tǒng)和腳本也不會(huì)對(duì)提高幀率有什么幫助。
當(dāng) CPU 壓力大,而 GPU 壓力小時(shí),就不應(yīng)該采取一些加大 CPU 壓力以減少 GPU 壓力的方法。反之亦然。
因此我們要分析找到影響運(yùn)行性能的短板。
垂直同步的影響
垂直同步(VSync)用來(lái)同步游戲的幀率和屏幕的刷新率。垂直同步會(huì)影響游戲的幀率,在Profiler窗口中可以看到影響。如果我們不是特別確定問(wèn)題所在,垂直同步的影響可能看起來(lái)像性能問(wèn)題,我們可以選擇在CPU usage profiler中隱藏Vsync信息,也可以在Quality settings 關(guān)閉垂直同步。
?
Frame Debugger
Frame Debugger是Unity另一個(gè)常用的性能分析工具,它能夠讓我們?cè)敿?xì)查看某一幀的渲染過(guò)程。只需在菜單欄選擇"Window > Analysis > Frame Debugger"即可打開。
在游戲運(yùn)行中,點(diǎn)擊Frame Debugger的Enable按鈕,游戲?qū)⒆詣?dòng)暫停,并在界面中展示當(dāng)前幀的渲染細(xì)節(jié)。
界面左側(cè)列表以層級(jí)視圖形式顯示繪制調(diào)用(DrawCall、事件等),右側(cè)面板提供有關(guān)繪制調(diào)用的更多信息,例如幾何體細(xì)節(jié)和用于渲染的著色器。
選中某一渲染步驟后,界面右側(cè)將顯示該步驟的詳細(xì)信息,包括渲染的目標(biāo),使用的Shader以及Shader屬性等詳細(xì)信息。同時(shí),Game視圖中也會(huì)展示該步驟渲染的結(jié)果。
Frame Debugger在優(yōu)化DrawCall和調(diào)試Shader時(shí)非常有用。
Memory Profiler
Memory Profiler是Unity分析內(nèi)存性能的進(jìn)階工具,可描繪更全面的內(nèi)存使用情況,使得性能優(yōu)化與內(nèi)存問(wèn)題檢測(cè)更為方便快捷。您可以使用它來(lái)檢查Unity應(yīng)用程序和Unity編輯器的內(nèi)存使用情況。您可以使用它來(lái)捕獲、檢查和比較內(nèi)存快照??煺沼涗浟水?dāng)內(nèi)存分析器捕獲快照時(shí),應(yīng)用程序使用的內(nèi)存是如何組織的。Memory Profiler還提供本機(jī)和托管內(nèi)存分配的概述,以評(píng)估應(yīng)用程序的內(nèi)存使用情況,并識(shí)別潛在的問(wèn)題,如內(nèi)存泄漏。
要避免應(yīng)用在容量有限的設(shè)備上出現(xiàn)內(nèi)存溢出崩潰的問(wèn)題,那么內(nèi)存優(yōu)化將是非常關(guān)鍵的一步。此外,如果項(xiàng)目需要發(fā)布至多個(gè)平臺(tái),開發(fā)者則需要調(diào)整內(nèi)存占用,以最大化利用每個(gè)平臺(tái)。
Memory Profiler讓面臨這些挑戰(zhàn)的用戶能夠截取并審查游戲在特定時(shí)間點(diǎn)的內(nèi)存占用。
借助這些“快照”,你可以找出游戲中最占內(nèi)存的部分或崩潰的原因。
Memory Profiler需要使用Package Manager安裝,Package Manager窗口左上角點(diǎn)擊“+”,Add pacakge by name : com.unity.memoryprofiler
?
Gmae View Statistics
在Unity的Game視圖包括一個(gè)統(tǒng)計(jì)窗口,顯示您的應(yīng)用程序在運(yùn)行模式下的實(shí)時(shí)渲染信息。要打開此窗口,請(qǐng)單擊右上角的 Stats 按鈕。該窗口會(huì)在 Game 視圖右上角疊加顯示。它包含的統(tǒng)計(jì)信息對(duì)于優(yōu)化性能很有用。顯示的具體統(tǒng)計(jì)信息根據(jù)構(gòu)建目標(biāo)而有所不同。
Statistics 窗口的字段信息:
- FPS:當(dāng)前 Unity 每秒能夠繪制的幀數(shù)
- CUP main:處理一幀所花費(fèi)的總時(shí)間。包括 Unity 處理應(yīng)用程序的幀更新所花費(fèi)的時(shí)間,以及 Unity 在編輯器中更新場(chǎng)景視圖、更新其他編輯器窗口或處理僅編輯器任務(wù)所花費(fèi)的時(shí)間。
- CUP render thread:渲染一幀所花費(fèi)的時(shí)間。這個(gè)數(shù)字包括Unity處理游戲視圖的幀更新所花費(fèi)的時(shí)間;它不包括Unity在編輯器中花費(fèi)的時(shí)間。
- Batches:Unity 在一幀內(nèi)處理的批次總數(shù)。該數(shù)字包括靜態(tài)和動(dòng)態(tài)批次。
- Saved by batching:?? ?Unity 合并的批次數(shù)。為確保良好的批處理,應(yīng)盡可能在不同游戲?qū)ο笾g共享材質(zhì)。更改渲染狀態(tài)會(huì)將批次分成具有相同狀態(tài)的組。
- Tris:Unity 在一幀內(nèi)處理的三角形數(shù)。在針對(duì)低端硬件進(jìn)行優(yōu)化時(shí),這一點(diǎn)非常重要。
- Verts:Unity 在一幀內(nèi)處理的頂點(diǎn)數(shù)。在針對(duì)低端硬件進(jìn)行優(yōu)化時(shí),這一點(diǎn)非常重要。
- Screen:屏幕的分辨率及其使用的內(nèi)存量。
- SetPass calls:?? ?Unity 在一幀中切換用于渲染游戲?qū)ο蟮闹魍ǖ赖拇螖?shù)。一個(gè)著色器可能包含多個(gè)著色器通道,每個(gè)通道以不同的方式渲染場(chǎng)景中的游戲?qū)ο?。每個(gè) pass 都需要 Unity 綁定一個(gè)新的著色器,這可能會(huì)帶來(lái) CPU 開銷。
- Shadow casters:在一幀中投射陰影的游戲?qū)ο蟮臄?shù)量。
- Visible skinned meshes:Unity 在幀中渲染的帶蒙皮的網(wǎng)格渲染器的數(shù)量。
- Animation components playing:幀期間播放的動(dòng)畫數(shù)量(Animation)。
- Animatior components playing:幀期間播放的動(dòng)畫數(shù)量(Animatior)。
Scene View Draw Mode
在Unity的Scene視圖右上角最左側(cè),可以改變Scene的繪制模式,不同的繪制模式有時(shí)對(duì)性能分析也有所幫助。
Shadow Cascades
使用顏色可以采用不同的級(jí)聯(lián)級(jí)別顯示場(chǎng)景的各個(gè)部分。此模式有助于正確設(shè)置陰影距離、級(jí)聯(lián)計(jì)數(shù)和級(jí)聯(lián)分割比率。請(qǐng)注意,此可視化方法會(huì)使用通常大于陰影距離的 Scene 視圖遠(yuǎn)平面,因此如果要將攝像機(jī)的游戲內(nèi)行為與小遠(yuǎn)平面匹配,可能需要縮短陰影距離。
Overdraw
將對(duì)象渲染為透明的“輪廓”。透明的顏色會(huì)累積,因此可以輕松找到一個(gè)對(duì)象繪制在另一個(gè)對(duì)象上的位置。顏色越亮表示Overdraw越高,可以簡(jiǎn)單的看出哪些地方過(guò)渡繪制。
比如在此模式下查看特效,如果發(fā)現(xiàn)特別亮,則說(shuō)明此特效Overdraw過(guò)高,應(yīng)考慮優(yōu)化。
Mipmaps
使用顏色代碼顯示理想的紋理大小:紅色表示紋理大于必要值(在當(dāng)前距離和分辨率下) ;藍(lán)色表示紋理可以更大。當(dāng)然,理想的紋理大小取決于游戲運(yùn)行的分辨率以及攝像機(jī)與特定表面的接近程度。
比如在此模式下瀏覽場(chǎng)景,如果發(fā)現(xiàn)有些地方特別紅,則說(shuō)明這個(gè)地方的貼圖Mipmap不合理,可以考慮壓縮貼圖。
Unity是個(gè)多平臺(tái)開發(fā)引擎,除了其內(nèi)置的性能分析工具,也可以通過(guò)導(dǎo)出對(duì)應(yīng)的平臺(tái)工程,使用對(duì)應(yīng)平臺(tái)原生的性能分析工具,如android studio, xcode
除了在運(yùn)行時(shí)進(jìn)行性能分析,我們也可以在非運(yùn)行時(shí)對(duì)資源進(jìn)行檢測(cè),對(duì)性能優(yōu)化也是十分有幫助的。
UWA本地資源檢測(cè)
UWA,https://www.uwa4d.com ?致力于游戲/VR應(yīng)用性能診斷與優(yōu)化,這里主要介紹下它的本地資源檢測(cè)。
UWA本地資源檢測(cè)是對(duì)游戲、VR等項(xiàng)目工程的資源、代碼和設(shè)置等進(jìn)行自動(dòng)檢測(cè)的服務(wù),是項(xiàng)目研發(fā)持續(xù)集成、持續(xù)交付流程中的重要一環(huán),旨在為游戲研發(fā)制定資源與代碼規(guī)范,幫助研發(fā)團(tuán)隊(duì)快速發(fā)現(xiàn)和解決項(xiàng)目中的性能問(wèn)題以及可能出現(xiàn)的異常、錯(cuò)誤。研發(fā)團(tuán)隊(duì)可通過(guò)日常的自動(dòng)檢查,規(guī)范程序、美術(shù)成員的開發(fā),從源頭上對(duì)項(xiàng)目進(jìn)行優(yōu)化,規(guī)避風(fēng)險(xiǎn),節(jié)約成本。
到官網(wǎng)下載SDK后,解壓放在Editor,即可使用,它有很多類型的檢測(cè),每次檢測(cè)掃描后會(huì)生成一份本地?cái)?shù)據(jù),需要使用上傳工具上傳數(shù)據(jù)到網(wǎng)站后臺(tái),然后登陸網(wǎng)站,可以查看分析報(bào)告。
詳細(xì)使用請(qǐng)參考:https://blog.uwa4d.com/archives/UWA_Pipeline40.html
Unity UPR 靜態(tài)資源檢測(cè)
Unity UPR,https://upr.unity.cn? 是Unity官方的專業(yè)團(tuán)隊(duì),為企業(yè)用戶提供真人真機(jī)測(cè)試、遠(yuǎn)程報(bào)告診斷、自動(dòng)化集成以及私有云部署等定制化服務(wù)。這里主要介紹下它的靜態(tài)資源檢測(cè)
UPR 靜態(tài)資源檢測(cè),不依賴 Unity Editor,通過(guò)無(wú)需安裝的可執(zhí)行程序,極快速的進(jìn)行資源掃描。UPR 可以將掃描結(jié)果直觀的展示出來(lái),幫助開發(fā)者盡早發(fā)現(xiàn)資源文件中存在的問(wèn)題。
下載工具后解壓,使用assetcheck.exe命令行生成報(bào)告數(shù)據(jù),可自行上傳數(shù)據(jù)到網(wǎng)站查看報(bào)告,也可提前在網(wǎng)站建好項(xiàng)目,工具會(huì)自動(dòng)上傳。