• 重庆快乐十分官网

  • 重庆快乐十分官网

  • 重庆快乐十分官网

  • 重庆快乐十分官网

重庆快乐十分官网

作者︰Alan777w  發(fa)布日期︰2020-02-25 23:31:26
Tag標簽︰性能  教程  官方  
  • 本文是Unity官方教程,性能優(you)化系列的第四(si)篇(pian)《Optimizing graphics rendering in Unity games》的翻譯。

     

    重庆快乐十分官网

    本文我們將會學(xue)習(xi)在(zai)Unity渲染一(yi)幀的na)緩蠡岱fa)生什麼,渲染時會發(fa)生哪(na)種類(lei)型的性能問題,以及怎樣去解決和渲染相關的性能問題。

    閱讀本文之(zhi)前,理解沒有一(yi)刀(dao)切的方法去改進渲染性能問題是至(zhi)關重要的。渲染性能被我們游(you)戲中的很(hen)多因(yin)素影響並且高度依賴我們游(you)戲運行的硬件(jian)和操作系統。最重要的是我們通過調查,實(shi)驗(yan),以及精確分析性能檢測的結果來解決性能問題。

    本文包括了一(yi)些最常見的渲染性能問題的信息(xi),以及解決方法和一(yi)些擴展閱讀資源(yuan)的鏈接(jie)。很(hen)可(ke)能我們的游(you)戲有一(yi)些問題本文沒有覆蓋。盡(jin)管如此,本文仍然會幫助我們理解我們的問題,給我們一(yi)些基礎知識(shi)使(shi)得我們更有效(xiao)的去查找解決方案。

    重庆快乐十分官网

    開始之(zhi)前,我們qiang)燜偌蛞 目純nity渲染一(yi)幀時發(fa)生了什麼。理解事件(jian)流和事情發(fa)生的正確時期將會幫助我們理解,研究,並且努力解決我們的性能問題。

    備注︰在(zai)本文中,我們將使(shi)用(yong)“object”,指代我們游(you)戲中被渲染的對象。任何wei)配(pei)秩咀榧jian)的GameObject都講稱作object。

    基本上,渲染流程如下(xia)︰

    -CPU計(ji)算出什麼東西需要被繪制(zhi),並且怎麼被繪制(zhi)。

    -CPU給GPU發(fa)送指令(ling)。

    -GPU根(gen)據CPU的指令(ling)進行繪制(zhi)。

    現在(zai)讓我們進一(yi)步看看發(fa)生了什麼。在(zai)本文的後面,我們將覆蓋上面每(mei)個步驟(zhou)的細節。但是現在(zai),我們先熟悉(xi)一(yi)些將會使(shi)用(yong)的名詞,以及理解在(zai)渲染中CPU和GPU所(suo)扮演的不同角色。

    渲染的過程通常被稱為渲染管線,這(zhe)十(shi)分有助于(yu)記憶。高效(xiao)的渲染在(zai)于(yu)保持信息(xi)流動。

    在(zai)渲染每(mei)一(yi)幀的時bei)潁PU都會做如下(xia)工作︰

    -CPU檢查屏幕上的每(mei)個object,決定(ding)他們是否應該被渲染jin)Ryi)個object只有滿足了一(yi)定(ding)的條件(jian)才會被渲染jin)@紓 囊yi)部分踫撞盒必須要在(zai)攝(she)像機的視錐(zhui)體內。不被渲染的object稱作被剔除了。想(xiang)了解更多關于(yu)視錐(zhui)體和視錐(zhui)體剔除的信息(xi),請閱讀this page。

    -CPU收zhan)   諱秩鏡拿mei)個object的信息(xi),並把這(zhe)些數(shu)據分類(lei)為指令(ling)被稱作繪制(zhi)指令(ling)draw calls。一(yi)個draw call包含(han)網格(ge)數(shu)據以及ba)ge)應該怎樣被渲染jin)@紓 Ω檬shi)用(yong)哪(na)個紋ping)懟Tzai)一(yi)定(ding)的情況下(xia),共享設置(zhi)的一(yi)些objects可(ke)能會被合並為一(yi)個draw call。合並不同objects的數(shu)據到同一(yi)個draw call被稱作batching。

    -CPU給每(mei)個draw call創建一(yi)個數(shu)據包,稱為batch。Batch有時會包含(han)一(yi)些draw call以外的數(shu)據,但是這(zhe)些情況通常不會對性能有什麼影響,因(yin)此在(zai)本文中我們將不會考(kao)慮這(zhe)些數(shu)據。

    每(mei)一(yi)個batch必須包含(han)一(yi)個draw call,CPU現在(zai)會做如下(xia)工作︰

    -CPU可(ke)能會發(fa)出指令(ling),使(shi)得GPU改變一(yi)些渲染狀(zhuang)態的變量。這(zhe)個指令(ling)被稱為SetPass call。SetPass通知GPU,使(shi)用(yong)哪(na)些設置(zhi)去渲染下(xia)一(yi)個網格(ge)。只有在(zai)渲染下(xia)一(yi)個網格(ge)時,渲染狀(zhuang)態和渲染上一(yi)個網格(ge)時發(fa)生了改變的情況下(xia),才會調用(yong)SetPass call。

    -CPU把draw call發(fa)送給GPU。draw call指示GPU使(shi)用(yong)最近的SetPass call定(ding)義的設置(zhi)去渲染指定(ding)的網格(ge)。

    -一(yi)定(ding)的情況下(xia),batch可(ke)能需要不止(zhi)一(yi)個的pass。pass是一(yi)段(duan)shader代碼,並且新的pass需要改變渲染狀(zhuang)態。對于(yu)batch中的每(mei)個pass,CPU必須發(fa)送一(yi)個新的SetPass call然後必須要再次(ci)發(fa)送draw call。

    同時,GPU做如下(xia)工作︰

    -GPU按(an)照CPU發(fa)送的指令(ling)順序(xu)處理這(zhe)些指令(ling)。

    -如果當前任務是SetPass call,那麼GPU更新渲染狀(zhuang)態。

    -如果當前任務是draw call,那麼GPU渲染網格(ge)。渲染網格(ge)發(fa)生在(zai)很(hen)多階zhui)危 煌 錐(zhui)蔚hader代碼可(ke)以yuan)ㄒ邃秩盡(jin)Uzhe)部分的渲染過程十(shi)分復雜,我們不會詳細講解,但是理解下(xia)面xian)鬧 shi)是很(hen)有用(yong)的︰頂點著色器(qi)vertex shader告訴GPU怎麼處理網格(ge)的頂點。片(pian)元(yuan)著色器(qi)fragment shader告訴GPU怎麼繪制(zhi)單獨的像素。

    -這(zhe)個過程會重復執(zhi)行,知道lang)PU發(fa)送的任務都被GPU完成。

    現在(zai)我們了解了Unity渲染幀時發(fa)生了什麼,讓我們qiang)kao)慮渲染時可(ke)能發(fa)生的一(yi)些問題。

    重庆快乐十分官网

    理解渲染最重要的是︰為了渲染一(yi)幀,CPU和GPU必須都完成他們的任務。他們中的任何一(yi)個花費了太長(chang)的時間去完成任務,都會造(zao)成渲染延遲。渲染問題有兩個基本的原因(yin)。第一(yi)類(lei)問題是由低效(xiao)的渲染管線引起的。當渲染管線中一(yi)步jiao)蛘叨嗖交(jiao) 蚜頌 chang)時間,打(da)斷(duan)了平jiao) 氖shu)據流時,渲染管線會很(hen)低效(xiao)。渲染管線的低效(xiao)被稱為瓶頸。第二類(lei)問題是由于(yu),渲染管線被塞入了太多的數(shu)據。即使(shi)是最高效(xiao)的渲染管線,對于(yu)一(yi)幀中可(ke)以yuan) 淼氖shu)據量也是有限制(zhi)的。

    當我們的游(you)戲花費太長(chang)的時間去渲染一(yi)幀,是由于(yu)CPU花費了過長(chang)的時間去完成渲染任務時,我們的游(you)戲被稱為CPU約束。當我們的游(you)戲花費太長(chang)的時間去渲染一(yi)幀,是由于(yu)GPU花費了過長(chang)的時間去完成渲染任務時,我們的游(you)戲被稱為GPU約束。

    重庆快乐十分官网

    在(zai)我們做任何修改前,先使(shi)用(yong)Profiler理解引起問題的原因(yin)是至(zhi)關重要的。不同的問題需要不同的解決方案。測量我們做出的改變的效(xiao)果也是很(hen)重要的。修復性能問題是一(yi)項平衡(heng)性的工作,改進一(yi)方面xian)男閱 侍猓 hen)可(ke)能會對其他方面有負面影響。

    我們將使(shi)用(yong)兩個工具來幫助我們理解和解決渲染性能問題。Profiler和frame debugger。他們qian)際nity內置(zhi)的工具。

    重庆快乐十分官网

    Profiler窗口允許我們實(shi)時的看到jie)蝸返男閱埽 頤強(qiang)ke)以看到jie)蝸返暮hen)多方面xian)氖shu)據,包括內存使(shi)用(yong),渲染管線,腳本性能等等。

    如果你還不熟悉(xi)使(shi)用(yong)Profiler,請參看Unity用(yong)戶手冊(ce)this page of the Unity Manual,以及這(zhe)篇(pian)教程Unity性能優(you)化(1)-官方教程The Profiler window翻譯 。

    重庆快乐十分官网

    frame debugger允許我們一(yi)步一(yi)步jiang)牟榭匆yi)幀是怎樣被渲染的。我們qiang)ke)以使(shi)用(yong)它查看詳細的渲染信息(xi),如在(zai)每(mei)個draw call中都繪制(zhi)了什麼,每(mei)個draw call的shader屬性以及發(fa)送到GPU的事件(jian)的順序(xu)。這(zhe)些信息(xi)幫助我們理解我們的游(you)戲是怎樣渲染的以及我們qiang)ke)以在(zai)哪(na)里改進性能。

    如果你還不熟悉(xi)frame debugger的使(shi)用(yong),請參考(kao)this page of the Unity Manual以及這(zhe)個視頻教程this tutorial video。

    重庆快乐十分官网

    在(zai)改進我們游(you)戲的渲染性能前,我們必須先確認我們游(you)戲運行慢是由渲染問題引起的。如果真正的問題是由于(yu)過于(yu)復雜的用(yong)戶腳本引起的,那麼ci)頤僑?you)化渲染性能是毫無意義的。如果你不太確認,性能問題是否有渲染引起的,請參考(kao)Unity性能優(you)化(2)-官方教程Diagnosing performance problems using the Profiler window翻譯 。

    一(yi)旦我們確認是渲染問題,我們必須同時bi)啡鮮PU限制(zhi)還是GPU限制(zhi)。不同問題有不同的解決方案,所(suo)以在(zai)試圖修復ci)侍 埃 斫庖鷂侍獾腦 yin)是至(zhi)關重要的。如果你不確定(ding)你的游(you)戲是CPU限制(zhi)還是GPU限制(zhi),請參考(kao)Unity性能優(you)化(2)-官方教程Diagnosing performance problems using the Profiler window翻譯 。

    重庆快乐十分官网

    基本上,在(zai)渲染一(yi)幀中,CPU的工作分為三類(lei)︰

    -決定(ding)什麼必須被繪制(zhi)

    -為GPU準(zhun)備好命令(ling)

    -發(fa)送命令(ling)給GPU

    這(zhe)三類(lei)工作包含(han)很(hen)多獨立的任務,這(zhe)些任務可(ke)能是通過多線程工作的。多線程允許不同的任務同時執(zhi)行;當一(yi)個線程執(zhi)行一(yi)個任務時,另一(yi)個線程可(ke)以同時執(zhi)行完全不同的任務。這(zhe)意味著工作能夠更快的完成。當渲染任務被分發(fa)到不同的線程時,稱為多線程渲染jin)/p>

    Unity渲染過程中和三類(lei)線程相關︰主線程,渲染線程和工人線程(the main thread, the render thread and worker threads)。主線程用(yong)于(yu)我們游(you)戲的主要CPU任務,包括一(yi)些渲染任務。渲染進程是專門(men)用(yong)于(yu)發(fa)送命令(ling)給GPU的。每(mei)個工人線程執(zhi)行一(yi)個單獨的任務,例如剔除和網格(ge)蒙皮。哪(na)些任務執(zhi)行在(zai)哪(na)個線程,取決于(yu)我們游(you)戲運行的硬件(jian)和游(you)戲的設置(zhi)。例如,CPU的核心(xin)數(shu)量越多,就會生成越多的工人線程數(shu)。由于(yu)這(zhe)個原因(yin),在(zai)我們的na)勘曖布jian)上進行性能分析是十(shi)分重要的。在(zai)不同的設備上,我們游(you)戲的表現可(ke)能相差(cha)很(hen)多。

    由于(yu)多線程渲染非常復雜並且依賴硬件(jian),在(zai)我們嘗(chang)試改進性能時,必須首先理解是哪(na)些任務導致了CPU限制(zhi)。如果我們的游(you)戲運行緩慢是因(yin)為在(zai)一(yi)個線程上剔除操作花費了太長(chang)的時間,那麼ci)頤竊zai)另一(yi)個線程上降(jiang)dang)頭(tou)?透PU命令(ling)的時間是不會有什麼幫助的。

    注意︰不是所(suo)有的平台都支持多線程渲染,在(zai)此時,WebGL不支持這(zhe)個功能。在(zai)不支持多線程渲染的平台上,所(suo)有的任務都在(zai)相同的線程中執(zhi)行。如果在(zai)這(zhe)樣的平台上,CPU限制(zhi)時,任何優(you)化CPU的工作都會改進CPU性能。如果我們的游(you)戲是這(zhe)種情況,我們應該閱讀下(xia)面xian)娜 空陸冢 ?銥kao)慮哪(na)些優(you)化最適合我們的游(you)戲。

    重庆快乐十分官网

    在(zai)Player settings中的Graphics jobs選項決定(ding)了Unity是否使(shi)用(yong)工人線程去執(zhi)行一(yi)些原本需要在(zai)主線程或者渲染線程中執(zhi)行的任務,在(zai)支持這(zhe)個功能的平台上,它能夠提供(gong)可(ke)觀的性能提升。如果我們希望使(shi)用(yong)這(zhe)個功能,我們應該分別對開啟或者關閉此功能進行性能分析,以觀察這(zhe)個功能對性能的提升效(xiao)果。

    重庆快乐十分官网

    我們qiang)ke)以使(shi)用(yong)Profiler來檢查哪(na)些任務引起了CPU限制(zhi)。請參考(kao)。。。

    現在(zai)我們理解了si)男┤撾褚鷂頤怯you)戲CPU限制(zhi),讓我們qiang)純闖<奈侍?徒餼齜槳浮/p>

    重庆快乐十分官网

    發(fa)送命令(ling)到GPU花費時間過長(chang)是引起CPU限制(zhi)的最常見的原因(yin)。在(zai)大(da)多數(shu)平台上,這(zhe)個任務是由渲染線程執(zhi)行的,個別平台在(zai)工人線程上執(zhi)行(如ps4)。

    發(fa)送命令(ling)到GPU中,其中最耗時的操作是SetPass call。如果CPU限制(zhi)是由發(fa)送命令(ling)到GPU引起的,那麼降(jiang)dang)etPass的數(shu)量ke) J親詈玫母納菩閱艿陌旆 /p>

    在(zai)Unity的渲染Profiler中,我們qiang)ke)以看到jie)卸嗌etPass call和batches被發(fa)送。有多少SetPass call被發(fa)送會造(zao)成性能問題,和游(you)戲的na)勘曖布jian)關系很(hen)大(da)。在(zai)高端(duan)pc上可(ke)以發(fa)送的SetPass call數(shu)量遠(yuan)遠(yuan)大(da)于(yu)移(yi)動平台。

    SetPass call以及相關的batches數(shu)量取決于(yu)幾個因(yin)素。本文稍後會詳細闡述。簡單來說(shuo),通常如下(xia)︰

    -降(jiang)dang)atches數(shu)量或者使(shi)更多的對象共享相同的渲染狀(zhuang)態,通常會減低SetPass call數(shu)量。

    -降(jiang)dang)etPass call數(shu)量,通常會改進CPU性能。

    如果降(jiang)dang)atches數(shu)量沒有降(jiang)dang)etPass call數(shu)量,他本身也會導致性能改進。這(zhe)是因(yin)為CPU能夠更有效(xiao)率shi)拇 淼?atch,即使(shi)它和幾個batches包含(han)了數(shu)量相同的網格(ge)數(shu)據。

    基本上,有三種方法降(jiang)dang)etPass call和batches的數(shu)量,我們將仔細論述下(xia)面xian)拿mei)一(yi)種方法︰

    -降(jiang)dang)鴕 秩鏡畝韻笫shu)量,通常可(ke)以同時降(jiang)dang)etPass call和batches的數(shu)量。

    -降(jiang)dang)兔mei)個要渲染的對象的渲染次(ci)數(shu),通常可(ke)以降(jiang)dang)etPass call

    -合並要渲染的對象的數(shu)據到更少的batches,可(ke)以降(jiang)dang)atches數(shu)量

    不同的技(ji)術適用(yong)于(yu)不同的游(you)戲,我們將考(kao)慮以上所(suo)有的選擇,決定(ding)哪(na)些適合我們的游(you)戲並且做出實(shi)驗(yan)。

    重庆快乐十分官网

    降(jiang)dang)鴕 秩鏡畝韻笫shu)量是最簡單的降(jiang)dang)atches 和 SetPass calls的方法。有以下(xia)幾個技(ji)術,可(ke)以降(jiang)dang)鴕 秩鏡畝韻笫shu)量︰

    -簡單的降(jiang)dang)臀頤淺【暗目ke)見對象數(shu)量,是一(yi)個有效(xiao)的解決方案。例如,我們要渲染有很(hen)多人物的人群,我們qiang)ke)以嘗(chang)試減少人物的數(shu)量,如果看起來人群的效(xiao)果仍然不錯,那麼這(zhe)就是一(yi)個比(bi)其他復雜方法快捷的多的優(you)化方法。

    -我們qiang)ke)以通過設置(zhi)攝(she)像機的剪裁平面xian)腦yuan)端(duan)來降(jiang)dang)蛻she)像機的繪制(zhi)範duan)?Uzhe)個屬性yuan)硎揪  she)像機多遠(yuan)的物體將不再被渲染jin)H綣頤竅xiang)隱藏遠(yuan)處的物體不被渲染的事實(shi),我們qiang)ke)以嘗(chang)試使(shi)用(yong)霧來掩(yan)蓋遠(yuan)處。

    -如果需要基于(yu)距離的更細粒度的隱藏物體,我們qiang)ke)以使(shi)用(yong)攝(she)像機的Layer Cull Distances屬性,它可(ke)以給不同的Layer設置(zhi)單獨的剪裁距離。如果我們有很(hen)多前景bai)笆shi)細節時,這(zhe)個方法很(hen)有用(yong)。我們qiang)ke)以使(shi)用(yong)很(hen)小的距離隱藏細節。

    -我們qiang)ke)以使(shi)用(yong)遮擋(dang)剔除功能去關閉被其他物體遮擋(dang)的物體的渲染jin)@紓 頤淺【爸杏幸yi)個很(hen)大(da)的建築(zhu),我們qiang)ke)以使(shi)用(yong)遮擋(dang)剔除功能,關閉它後面xian)奈鍰宓匿秩盡(jin)nity的遮擋(dang)剔除功能不適用(yong)于(yu)所(suo)有的場景,它會導致額(e)外的cpu消(xiao)耗,並且相關設置(zhi)很(hen)復雜,但是在(zai)一(yi)些場景中,它可(ke)能會極大(da)的改善性能。使(shi)用(yong)遮擋(dang)剔除的最佳實(shi)踐,This Unity blog post on occlusion culling best practices。

    另外,我們qiang)ke)以通過手zhi)?墓乇瘴鍰邃秩糾詞shi)現我們自(zi)己的遮擋(dang)剔除,我們qiang)ke)以手zhi)?墓乇瘴頤侵 勞婕jia)無法看到jiang)奈鍰宓匿秩盡(jin)@紓 綣頤塹某【鞍han)一(yi)些過場的物體,那麼在(zai)他們出現之(zhi)前或者移(yi)出以後,我們應該手zhi)?墓乇賬塹匿秩盡(jin)6雜yu)我們游(you)戲來說(shuo),使(shi)用(yong)我們的知識(shi),手zhi)?奶蕹 bi)Unity動態的遮擋(dang)剔除有效(xiao)的多。

    重庆快乐十分官网

    實(shi)時的光照,陰影和tou)瓷淇ke)以極大(da)的提高我們游(you)戲的真實(shi)感,但是這(zhe)些操作可(ke)能非常昂貴。使(shi)用(yong)這(zhe)些功能可(ke)能導致物體被渲染多次(ci),這(zhe)對性能有很(hen)大(da)的影響。

    這(zhe)些功能的精確的影響依賴于(yu)我們游(you)戲選擇的渲染路徑。渲染路徑,也就是表明(ming)當我們繪制(zhi)場景的時bei)潁 秩炯ji)算的執(zhi)行順序(xu)。不同渲染路徑最主要的不同,是它們怎麼處理實(shi)時光照,陰影和tou)瓷洹M @此shuo),如果我們游(you)戲運行在(zai)比(bi)較(jiao)高端(duan)shuo)納璞干希 ?矣τyong)了很(hen)多實(shi)時光照,陰影和tou)瓷涫保 映黌秩臼潛bi)較(jiao)好的選擇。前向渲染適用(yong)于(yu)低端(duan)設備,並且不使(shi)用(yong)以上功能。盡(jin)管如此,如果我們需要更好的使(shi)用(yong)實(shi)時光照,陰影和tou)瓷淶裙δ埽 榭鍪鞘shi)分復雜的,最好研究相關主題以及實(shi)驗(yan)。請參考(kao)This page of the Unity Manua這(zhe)是一(yi)個十(shi)分有用(yong)的起點。 請參考(kao)This tutorial這(zhe)里包含(han)了Unity中光照的相關主題內容。

    不論選擇哪(na)種渲染路徑,使(shi)用(yong)實(shi)時光照,陰影和tou)瓷潿薊嵊跋 頤怯you)戲的性能,所(suo)以,理解怎樣去優(you)化他們是十(shi)分重要的。

    -Unity中動態光照是很(hen)復雜的主題,討論他超過了本文範duan)? 氬慰kao)this tutorial和 this page of the Unity Manual。

    -動態光照很(hen)昂貴。當我們的場景包含(han)靜態物體時,例如風景,我們qiang)ke)以使(shi)用(yong)烘焙(bei)技(ji)術去預計(ji)算場景的光照,這(zhe)樣就不需要在(zai)運行時計(ji)算光照了。具體請參考(kao)This tutorial和 this section of the Unity Manual。

    -如果我們希望在(zai)游(you)戲中使(shi)用(yong)實(shi)時陰影,我們qiang)ke)能可(ke)以改進這(zhe)方面xian)男閱塴his page of the Unity Manual 這(zhe)篇(pian)文章介(jie)紹的陰影設置(zhi),以及這(zhe)些設置(zhi)怎麼影響性能的。例如,我們qiang)ke)以設置(zhi)陰影距離,確保只有近處的物體投射陰影。

    -反射探(tan)頭(tou)創建真實(shi)感的反射,但是會很(hen)大(da)的影響batches數(shu)量。最好我們在(zai)性能敏感的場合最小化的使(shi)用(yong)它,並且無論在(zai)哪(na)使(shi)用(yong)了他們qian)家(jia)﹥jin)可(ke)能的優(you)化。反射探(tan)頭(tou)的優(you)化請參考(kao)This page of the Unity Manual。

    重庆快乐十分官网

    在(zai)一(yi)定(ding)情況下(xia),一(yi)個batch可(ke)以包含(han)多個物體的數(shu)據。為了可(ke)以適合合並,物體必須滿足以下(xia)條件(jian)︰

    -共享相同材質shi)南嗤 shi)例

    -有一(yi)樣的設置(zhi)(例如,紋ping)恚hader,shader參數(shu)等)

    合並合適shi)奈鍰蹇ke)以改進性能,盡(jin)管如此,所(suo)有的優(you)化技(ji)術我們qian)急匭冑︵xin)的分析,合並的消(xiao)耗沒有超過獲得的性能改進。

    合並合適shi)奈鍰逵屑鋼植煌 募ji)術︰

    -靜態batching技(ji)術,允許Unity合並相鄰(lin)的不移(yi)動的合適shi)奈鍰濉Ryi)個好的例子是,一(yi)堆yan)嗨頻奈鍰澹 緹奘  ke)以yuan)泳蔡atch中受(shou)益(yi)良多。在(zai)游(you)戲中設置(zhi)靜態batch,請參考(kao)This page of the Unity Manual。

    靜態batch會導致更高的na)詿嬲zhan)用(yong),所(suo)以我們在(zai)優(you)化時要衡(heng)量這(zhe)個代價。

    -動態batching技(ji)術,是另外一(yi)種Unity合並合適shi)奈鍰宓募ji)術,不論它是運動還是靜止(zhi)。對能夠使(shi)用(yong)這(zhe)種技(ji)術合並的物體,有一(yi)些限制(zhi)。這(zhe)些限制(zhi)請參考(kao)this page of the Unity Manual 動態batching會影響CPU使(shi)用(yong),可(ke)能會引起CPU消(xiao)耗的時間大(da)于(yu)節省的時間。我們應該通過實(shi)踐衡(heng)量ke)拇郟 ?以zai)使(shi)用(yong)的時bei)蜃 庹zhe)些。

    -合並Unity的UI元(yuan)素要更復雜一(yi)些,因(yin)為他會受(shou)我們界面布局的影響。具體請參考(kao)This video from Unite Bangkok 2015和this guide to optimizing Unity UI。

    -GPU instancing技(ji)術允許大(da)量一(yi)樣的物體十(shi)分高效(xiao)的合並處理。它的使(shi)用(yong)有一(yi)定(ding)限制(zhi),並且不是所(suo)有硬件(jian)都支持,但是如果我們的游(you)戲在(zai)場景中同時存在(zai)大(da)量相同的物體,我們qiang)ke)以在(zai)這(zhe)個技(ji)術下(xia)收益(yi)。請參考(kao)This page of the Unity Manual 這(zhe)里介(jie)紹了Unity中GPU instancing的技(ji)術細節以及怎樣使(shi)用(yong)它,支持哪(na)些平台,以及在(zai)哪(na)種環境(jing)下(xia),我們的游(you)戲會受(shou)益(yi)于(yu)此。

    -紋ping)磽技(ji)  前汛da)量的小紋ping)硨喜? yi)張大(da)的紋ping)磽嫉募ji)術。它通常在(zai)2d游(you)戲和UI系統中使(shi)用(yong),但是也可(ke)以在(zai)3d游(you)戲中使(shi)用(yong)。當我們使(shi)用(yong)這(zhe)個技(ji)術為游(you)戲創建美術資源(yuan)時,我們qiang)ke)以確保物體共享同一(yi)圖ji)  yin)此適合合並。Unity內置(zhi)了圖ji) ?prite Packer。

    -我們qiang)ke)以手zhi)?暮喜 蠶硐嗤 鬧屎臀評(ping)淼耐ge),不論是在(zai)Unity編(bian)輯(ji)器(qi)中還是在(zai)運行時使(shi)用(yong)代碼。當我們手zhi)?喜?ge)時,我們必須意識(shi)到,陰影,光照和剔除仍然在(zai)每(mei)個單獨的物體層(ceng)級上操作。這(zhe)意味著,合並網格(ge)所(suo)產生的性能提升,很(hen)可(ke)能被本來可(ke)以yuan)惶蕹奈鍰澹 輝儔惶蕹耍 吹撓跋斕di)消(xiao)。如果我們想(xiang)深入研究這(zhe)項技(ji)術,我們應該查看Mesh.CombineMeshes函數(shu) ,Unity’s Standard Assets package中的CombineChildren腳本是一(yi)個例子。

    -在(zai)腳本中,我們必須小心(xin)使(shi)用(yong)Renderer.material,這(zhe)會復制(zhi)材質,並且返回一(yi)個新副(fu)本的引用(yong)。這(zhe)樣做會破壞batching,如果這(zhe)是合並中的一(yi)部分。因(yin)為renderer不再持有相同的材質引用(yong)了。如果我們需要訪問一(yi)個在(zai)合並中的物體的材質,我們應該使(shi)用(yong)Renderer.sharedMaterial。

    重庆快乐十分官网

    剔除,收zhan)   換嬤zhi)的物體的數(shu)據,排序(xu)這(zhe)些數(shu)據,生成GPU命令(ling),這(zhe)些都對CPU限制(zhi)有貢獻。這(zhe)些任務會在(zai)主線程或者獨立的工人線程中運行,取決于(yu)我們游(you)戲的設置(zhi)以及目標硬件(jian)。

    -剔除本身消(xiao)耗並不大(da),但是減少不必要的剔除操作可(ke)能會對性能有幫助。剔除是qian)猿【爸忻mei)個激活的物體,每(mei)個攝(she)像機每(mei)個物體的計(ji)算,甚至(zhi)是哪(na)些不被渲染的層(ceng)級的物體。為了降(jiang)dang)駝zhe)些,我們應該關閉攝(she)像機,並且對于(yu)當前an)皇shi)用(yong)的物體反激活或者禁用(yong)renderer。

    -Batching可(ke)以極大(da)的增加向GPU發(fa)送命令(ling)的速度,但是他有時可(ke)能會在(zai)其他地方帶來消(xiao)耗。如果batching操作造(zao)成了CPU限制(zhi),我們qiang)ke)以會要限制(zhi)手zhi)?蛘咦zi)yuan)atching操作的數(shu)量。

    重庆快乐十分官网

    SkinnedMeshRenderers在(zai)當我們使(shi)用(yong)一(yi)個網格(ge)動畫變形時(技(ji)術上稱為骨骼動畫)使(shi)用(yong)。它最多的用(yong)在(zai)動畫人物身上。渲染蒙皮的任務通常在(zai)主線程或者單獨的工人線程,依賴于(yu)游(you)戲的設置(zhi)以及目標硬件(jian)。

    渲染蒙皮可(ke)能會是昂貴的操作。如果我們在(zai)渲染Profiler中,看到渲染蒙皮對CPU限制(zhi)影響很(hen)大(da),這(zhe)里有幾個方法我們qiang)ke)以嘗(chang)試去改進它的性能。

    -我們應該mei)kao)慮當前正在(zai)使(shi)用(yong)SkinnedMeshRenderers組件(jian)的物體是否有必要使(shi)用(yong)。可(ke)能是這(zhe)種情況,我們導入的na)P桶han)了SkinnedMeshRenderers組件(jian),但是我們其實(shi)並不需要它運動。這(zhe)種情況下(xia),我們使(shi)用(yong)MeshRenderer組件(jian)替biao)凰 嵊兄yu)性能提升。當我們在(zai)Unity中導入模型時,如果我們在(zai)模型的導入設置(zhi)中選擇不導出動畫,這(zhe)個模型就會包含(han)一(yi)個MeshRenderer組件(jian)替biao)kinnedMeshRenderers組件(jian)。

    -如果我們只在(zai)一(yi)些時刻運動物體(例如,只在(zai)游(you)戲開始時,或者只有距離攝(she)像機一(yi)定(ding)距離內時),我們應該交(jiao)換為一(yi)個細節較(jiao)少的網格(ge),或者使(shi)用(yong)MeshRenderer替biao)kinnedMeshRenderers。SkinnedMeshRenderers組件(jian)有一(yi)個函數(shu)BakeMesh,可(ke)以用(yong)匹配(pei)的動作創建一(yi)個網格(ge),這(zhe)個十(shi)分有用(yong),在(zai)不同的網格(ge)或渲染器(qi)中切換時物體不會有可(ke)見的變化。

    -這(zhe)些文章有關于(yu)使(shi)用(yong)蒙皮的優(you)化建議,請參考(kao)This page of the Unity Manual 和the Unity Manual page on the SkinnedMeshRenderer component,還應該記住,蒙皮的消(xiao)耗是在(zai)每(mei)個頂點上,因(yin)此,使(shi)用(yong)頂點較(jiao)少的na)P涂ke)以有效(xiao)降(jiang)dang)凸?髁俊/p>

    -在(zai)一(yi)些平台上,和CPU相比(bi),蒙皮可(ke)以yuan)PU更高效(xiao)的處理。如果我們的GPU比(bi)較(jiao)強(qiang),這(zhe)個值dang)貿chang)試。我們qiang)ke)以為當前平台開啟GPU蒙皮,在(zai)Player Settings中。

    重庆快乐十分官网

    理解許多主線程的任務是和渲染無關的很(hen)重要。這(zhe)意味著,如果是CPU限制(zhi)發(fa)生在(zai)主線程,我們應該把優(you)化CPU時間改進性能的努力放在(zai)和渲染無關的任務上。

    例如,在(zai)某個時間點上,我們的游(you)戲需要做十(shi)分昂貴的渲染操作並且在(zai)主線程上我們的腳本操作也非常昂貴,使(shi)得CPU限制(zhi)。如果我們已經在(zai)不損失視覺真實(shi)dao)鵲那疤嵯xia)盡(jin)可(ke)能的優(you)化渲染了,那麼ci)頤羌跎儆yong)戶腳本的CPU消(xiao)耗可(ke)能會改進性能。

    重庆快乐十分官网

    如果游(you)戲是GPU限制(zhi),那麼第一(yi)件(jian)事就是找到GPU瓶頸的原因(yin)。GPU性能最常被填充(chong)率限制(zhi),尤其在(zai)移(yi)動平台,但是顯(xian)存帶寬和頂點處理也可(ke)能影響。讓我們檢查這(zhe)些問題,並且學(xue)習(xi)引起問題的原因(yin),怎麼診斷(duan)和怎麼修復ci)侍狻/p>

    重庆快乐十分官网

    填充(chong)率是指GPU在(zai)屏幕上每(mei)秒可(ke)以渲染的像素數(shu)。如果我們的游(you)戲收到填充(chong)率shi)南拗zhi),意味著我們的游(you)戲每(mei)幀嘗(chang)試繪制(zhi)的像素數(shu)量超過了GPU的處理能力。

    檢查是否填充(chong)率引起了游(you)戲GPU限制(zhi)很(hen)簡單︰

    -使(shi)用(yong)Profiler分析,注意GPU時間

    -在(zai)Player settings中降(jiang)dang)拖xian)示分辨率

    -再次(ci)分析游(you)戲,如果性能改善了,很(hen)可(ke)能是填充(chong)率shi)奈侍/p>

    如果確認了填充(chong)率引起了問題,有幾個方法可(ke)以解決問題︰

    -片(pian)元(yuan)shader是告訴GPU怎麼樣去繪制(zhi)一(yi)個像素的一(yi)段(duan)shader代碼。這(zhe)段(duan)wei)PU需要為每(mei)一(yi)個需要繪制(zhi)的像素執(zhi)行,所(suo)以如果這(zhe)段(duan)wei)冑xiao)率shi)停 敲春hen)容易發(fa)生性能問題。復雜的片(pian)元(yuan)shader是很(hen)常見的引起填充(chong)率shi)侍獾腦 yin)。

    -如果我們的游(you)戲使(shi)用(yong)Unity內置(zhi)shader,我們應該使(shi)用(yong)最簡單和最優(you)化的shader,為了達到我們想(xiang)要的視覺效(xiao)率。例如,the mobile shaders是Unity針對移(yi)動平台高度優(you)化的shader,我們應該實(shi)驗(yan)使(shi)用(yong)它們是否可(ke)以在(zai)不影響視覺效(xiao)果的前提下(xia)改善性能。這(zhe)些shader是為了移(yi)動平台設計(ji)的,但是它們也適用(yong)于(yu)任何項目。如果使(shi)用(yong)它們qiang)ke)以yuan) 較(jiao)金渴泳跣xiao)果的要求(qiu),那麼在(zai)非移(yi)動平台上使(shi)用(yong)它們也是能夠很(hen)好的改善性能的。

    -如果游(you)戲中的物體使(shi)用(yong)的是Unity的Standard Shader,那麼理解Unity編(bian)譯這(zhe)些shader是基于(yu)當前的材質設置(zhi)的是很(hen)重要的。只有xin)切┐鼻笆shi)用(yong)的功能會被編(bian)譯。這(zhe)意味著,移(yi)除例如detail maps可(ke)以減少片(pian)元(yuan)shader的復雜度,這(zhe)對性能提升有很(hen)大(da)益(yi)處。如果我們游(you)戲中是這(zhe)種情況,我們應該實(shi)踐,是否能夠在(zai)不影響視覺質量的前提是提升性能。

    -如果我們游(you)戲使(shi)用(yong)的是qian)ding)制(zhi)的shader,我們應該盡(jin)可(ke)能的優(you)化它。優(you)化shader是一(yi)個很(hen)復雜的主題,請參考(kao)this page of the Unity Manual和 this page of the Unity Manual。

    -Overdraw是指相同的像素繪制(zhi)了多次(ci)。這(zhe)是在(zai)物體繪制(zhi)在(zai)其他物體之(zhi)上的時bei)蚍fa)生的,也在(zai)很(hen)大(da)程度上引起了填充(chong)率shi)侍狻N 死斫verdraw,我們必須先理解Unity在(zai)場景中繪制(zhi)物體的順序(xu)。物體的shader決定(ding)了物體的繪制(zhi)順序(xu),通常由render queue屬性決定(ding)。Unity使(shi)用(yong)這(zhe)些信息(xi)按(an)照嚴(yan)格(ge)的順序(xu)繪制(zhi)物體,具體細節請參考(kao)page of the Unity Manual 另外在(zai)不同render queue的物體在(zai)被繪制(zhi)之(zhi)前會按(an)不同的順序(xu)排序(xu)。例如,Unity在(zai)Geometry queue中為最小化Overdraw會從前到後排序(xu)物體,但是在(zai)Transparent queue中,為了達到視覺效(xiao)果的要求(qiu),則是從後到前排序(xu)物體。在(zai)Transparent queue中,從後向前排序(xu)物體其實(shi)最大(da)化了Overdraw。Overdraw是一(yi)個很(hen)復雜的主題,並且沒有一(yi)刀(dao)切的解決方案,但是降(jiang)dang)橢氐鍰宓氖shu)量使(shi)得Unity不能自(zi)yuan) 判xu)是關鍵。調查Overdraw問題最好的起點是Unity的場景視圖中,DrawMode允許我們qiang)吹匠【爸械verdraw,我們qiang)ke)以yuan)誘zhe)開始降(jiang)dang)verdraw的工作。最常見的引起Overdraw的因(yin)素是透明(ming)材質,未(wei)優(you)化的粒子,和重疊的UI元(yuan)素。所(suo)以我們應該嘗(chang)試優(you)化這(zhe)些。請參考(kao)This article on the Unity Learn site 這(zhe)篇(pian)文章聚焦于(yu)UI,但是也包含(han)了Overdraw的很(hen)好的指導。

    -使(shi)用(yong)屏幕後處理技(ji)術也會極大(da)的影響填充(chong)率,尤其是我們使(shi)用(yong)了不止(zhi)一(yi)種的屏幕後處理的時bei)頡H綣頤竊zai)使(shi)用(yong)屏幕後處理是遇到了填充(chong)率shi)侍猓 頤怯Ω貿chang)試不同的設置(zhi)或者使(shi)用(yong)更加優(you)化的屏幕後處理版本jin)@縭shi)用(yong)Bloom (Optimized)替biao)loom。如果我們在(zai)同一(yi)個攝(she)像機下(xia)使(shi)用(yong)了多個屏幕後處理,這(zhe)將造(zao)成成倍(bei)的shader pass。這(zhe)種情況下(xia),我們應該合並shader到一(yi)個單獨的pass,例如Unity’s PostProcessing Stack。如果我們優(you)化屏幕後處理效(xiao)果後,仍然有填充(chong)率shi)侍猓 敲次(ci)頤且殘硪 kao)慮關閉屏幕後處理,尤其是在(zai)低端(duan)shuo)納璞干稀/p>

    重庆快乐十分官网

    顯(xian)存帶寬是指GPU讀寫它的專用(yong)內存xian)乃俁取H綣頤塹撓you)戲受(shou)限于(yu)顯(xian)存帶寬,通常意味著我們使(shi)用(yong)的紋ping)硤 da)了,以至(zhi)于(yu)GPU無法快速處理。

    我們qiang)ke)以按(an)如下(xia)方法檢查是否顯(xian)存帶寬的問題︰

    -用(yong)Profiler分析游(you)戲,並關注GPU時間

    -在(zai)質量ke)柚zhi)中降(jiang)dang)偷鼻捌教 奈評(ping)碇柿/p>

    -繼(ji)續分析游(you)戲,如果性能改善了,那麼通常是顯(xian)存帶寬的問題。

    如果是顯(xian)存帶寬的問題,我們需要降(jiang)dang)臀評(ping)淼哪(na)詿嬲zhan)用(yong)。針對不同的游(you)戲通常有不同的最佳解決方案,這(zhe)里我們提供(gong)幾個優(you)化紋ping)淼姆椒 /p>

    -紋ping)硌顧跫ji)術可(ke)以同時極大(da)的降(jiang)dang)臀評(ping)碓zai)磁盤(pan)和內存中的大(da)小。如果是顯(xian)存帶寬的問題,那麼使(shi)用(yong)紋ping)硌顧跫跣 評(ping)碓zai)內存xian)拇da)小可(ke)以幫助改善性能。Unity中有很(hen)多可(ke)用(yong)的紋ping)硌顧醯母ge)式和設置(zhi)。通常來說(shuo),一(yi)些紋ping)硌顧醺ge)式只要可(ke)用(yong)就應該盡(jin)可(ke)能的使(shi)用(yong),盡(jin)管如此,通過實(shi)踐找到針對每(mei)個紋ping)磣詈鮮實(shi)納柚zhi)是最好的。請參考(kao)This page in the Unity Manual 講述了紋ping)硌顧醯母ge)式和各種設置(zhi)的詳細信息(xi)。

    -多級漸(jian)遠(yuan)紋ping)恚 nity對遠(yuan)處的物體使(shi)用(yong)的低tou)直媛拾奼鏡奈評(ping)懟H綣頤塹某【鞍han)距離攝(she)像機很(hen)遠(yuan)的物體,我們qiang)ke)以通過使(shi)用(yong)多級漸(jian)遠(yuan)紋ping)砝椿航庀xian)存帶寬的問題。Unity場景視圖中的The Mipmaps Draw Mode允許我們查看哪(na)些物體受(shou)益(yi)于(yu)多級漸(jian)遠(yuan)紋ping)恚 氬慰kao)this page of the Unity Manual 包含(han)了使(shi)用(yong)多級漸(jian)遠(yuan)紋ping)淼南 感畔xi)。

    重庆快乐十分官网

    頂點處理是指GPU必須渲染網格(ge)中的每(mei)一(yi)個頂點的工作。頂點處理的消(xiao)耗受(shou)兩件(jian)事情影響︰必須渲染的頂點數(shu)量,以及在(zai)每(mei)個頂點上要進行的操作數(shu)量。

    如果我們的游(you)戲是GPU限制(zhi),並且已經確認了不是填充(chong)率和顯(xian)存帶寬引起的問題,那麼就很(hen)可(ke)能是qian)?憒 硪鸕摹H綣欽zhe)種情況,那麼嘗(chang)試減少GPU頂點處理的數(shu)量很(hen)可(ke)能會獲得性能提升。

    有一(yi)些方法可(ke)以減少頂點數(shu)量或者在(zai)每(mei)個頂點上執(zhi)行的操作數(shu)量︰

    -首先,我們應該降(jiang)dang)筒槐匾 耐ge)復雜的。如果我們使(shi)用(yong)的網格(ge)包含(han)在(zai)游(you)戲中無法被看見的LOD,或者低效(xiao)的網格(ge)在(zai)錯誤的創建時包含(han)了太多的頂點,這(zhe)些都會浪(lang)費GPU的工作量。最直接(jie)的降(jiang)dang)投?憒 淼南xiao)耗的方法,就是在(zai)3d建模軟件(jian)中創建模型時使(shi)用(yong)更少數(shu)量的頂點。

    -我們qiang)ke)以嘗(chang)試使(shi)用(yong)法線貼圖ji)際  頤鞘shi)用(yong)它來模擬(ni)更高幾何復雜度的網格(ge)。盡(jin)管使(shi)用(yong)這(zhe)種技(ji)術有一(yi)些GPU負載,但是在(zai)多數(shu)情況下(xia),它會獲得性能提升。請參考(kao)This page of the Unity Manual 介(jie)紹了使(shi)用(yong)法線貼圖ji)際躒?Dni)更復雜的網格(ge)。

    -如果我們的游(you)戲沒有使(shi)用(yong)法線貼圖ji)際  zai)網格(ge)的導入設置(zhi)中,我們qiang)ke)以關閉頂點的切線。這(zhe)會降(jiang)dang)PU處理頂點的數(shu)據量。

    -LOD(Level of detail),這(zhe)是當物體遠(yuan)離攝(she)像機時,降(jiang)dang)臀鍰逋ge)的復雜度的技(ji)術。這(zhe)可(ke)以有效(xiao)的降(jiang)dang)PU需要渲染的頂點數(shu)量,並且不影響視覺表現。具體使(shi)用(yong)細節請參考(kao). The LOD Group page of the Unity Manual。

    -頂點shader,是一(yi)段(duan)shader代碼,告訴GPU怎麼繪制(zhi)每(mei)個頂點。如果我們的游(you)戲受(shou)限制(zhi)于(yu)頂點處理的影響,那麼降(jiang)dang)投?hader的復雜度可(ke)能會有助于(yu)性能提升。

    -如果我們的游(you)戲使(shi)用(yong)Unity內置(zhi)shader,我們應該使(shi)用(yong)最簡單和最優(you)化的shader,為了達到我們想(xiang)要的視覺效(xiao)率。。例如,the mobile shaders是Unity針對移(yi)動平台高度優(you)化的shader,我們應該實(shi)驗(yan)使(shi)用(yong)它們是否可(ke)以在(zai)不影響視覺效(xiao)果的前提下(xia)改善性能。

    --如果我們游(you)戲使(shi)用(yong)的是qian)ding)制(zhi)的shader,我們應該盡(jin)可(ke)能的優(you)化它。優(you)化shader是一(yi)個很(hen)復雜的主題,請參考(kao)this page of the Unity Manual 和 this page of the Unity Manual。

    重庆快乐十分官网

    我們已經學(xue)習(xi)了Unity中,是怎樣渲染的,當渲染時可(ke)能會發(fa)生什麼ci)侍猓 約霸躚zai)我們的游(you)戲中提高渲染的性能。使(shi)用(yong)這(zhe)些知識(shi)以及性能分析工具Profiler,我們qiang)ke)以修復渲染相關的性能問題,並且構建我們的游(you)戲使(shi)他們具有流暢有效(xiao)率shi)匿秩玖魎 摺/p>

    下(xia)面列出本文主題的相關資源(yuan)

    重庆快乐十分官网

About IT165 -廣告服務 -隱私聲明(ming) -版權(quan)申明(ming) -免責條款 -網站地圖 -網友投稿 -聯系方式
本站內容來自(zi)于(yu)互聯網,僅供(gong)用(yong)于(yu)網絡技(ji)術學(xue)習(xi),學(xue)習(xi)中請遵循相關法律法規
重庆快乐十分官网 | 下一页