Unity渲染優化中文翻譯(三)——GPU的優化策略


  轉載請標明出處http://www.cnblogs.com/zblade/

  如果游戲的渲染瓶頸來自於GPU

  首要任務就是找出造成GPU瓶頸的因素所在,通常GPU的性能受到像素分辨率的影響,特別是在移動客戶端的游戲,但是內存帶寬和頂點計算的影響也需要注意。這些因素的影響都需要實時的測試和定位。

  一、像素分辨率

  像素分辨率是指GPU每秒可以渲染的像素個數,如果游戲受到像素分辨率的影響,則意味着游戲每幀描繪的像素點個數超過了GPU可以處理的極限。

  檢測游戲是否收到像素分辨率的影響可以通過以下方式:

  1、分析游戲,注意GPU的運行時間;

  2、在unity的Player Settings中設置降低分辨率

  3、這時候運行分析游戲,如果游戲的性能得到提升,則有可能是像素分辨率造成性能問題。

  下面有一些方法來解決像素分辨率造成的問題:

  1、 shader中的片元着色器主要用來告訴GPU如何繪制每個片元的像素,所以如果片元着色器的執行效率不高,則會造成游戲性能的降低。復雜的片元着色器代碼通常是造成分辨率問題的原因。

  如果我們采用內置的shader,在視覺特效上最好采用最簡單和最優化的shader。例如,the mobile shaders that ship with unity就是高度優化的shader,我們可以通過使用他們來測試是否對游戲的性能有影響同時並不影響游戲的表現。這些shaders是專為手機平台而設計,但是在其他平台上也可以使用。特別在並不影響游戲的表現效果的情況下,使用這些shader有極大的優勢。

  如果游戲中的物體使用Standard Shader,那么需要知道在unity中,這些shader的編譯依賴於當前的材質設置。只有當前被使用的特性才會被編譯。那么可以通過移除地圖細節等特征來極大的提高片元着色器的性能。此外,如果在游戲中進行這樣的操作測試,需要測試該操作是否會影響游戲的整體表現品質。

  如果游戲采用定制的shader,則我們需要盡可能的優化這類shader。shader的優化是極其復雜的,這兒這兒的Shader optimization部分都給出了一些優化建議。

  2、Overdraw是指相同的像素被多次渲染,如果某些Objects在其他objects之上,則會將起多次渲染造成像素問題。要理解overdraw,則需要了解unity中的渲染順序設置。每個物體的渲染順序是由其上的shader決定的,特別是shader中的render queue。Unity極其依賴渲染順序的設置,詳見此處。此外,在物體渲染之前,不同的render queue中物體會進行不同的排序。例如,在Unity中,如果render queue設置為Geometry,則其排序為從前到后渲染。如果render queue設置為Transparent,則其渲染排序為從后到前,從后到前的渲染順序會造成渲染的極大化。overdraw是一個復雜的問題,沒有一個合適的方法來解決這個問題,但是減少unity不能自動排序的重疊的物體的數量是一種好的途徑。

  解決這類問題最好在unity的scene視圖下,此處可以設置Draw Mode模式下的場景視圖,從而查找如何減少這類物體。通常造成overdraw的原因是透明材質,極費的特效,和多重疊加的UI,所以對於這些的優化都需要測試優化效果。This article on the unity learn site主要講解UI的優化,但是對於減少overdraw也有一定的建議。

  3、游戲中的圖像特效會極大的造成像素問題,特別是有多個圖像特效。如果游戲受到像素的影響同時又采用了圖像特效,則最好對圖像特效進行優化,比如用優化后的爆炸特效來替代優化前的爆炸特效。特別是在同一個相機上有多個圖像特效,這會造成多個shader pass,這種情況下最好將多個圖像特效合並在一個shader pass中。如果這樣設置都不能解決問題,則最好考慮是否不使能圖像特效,特別是在低端機上。

  二、存儲帶寬

  存儲帶寬是指GPU在其特定的內存上的讀寫速率,如果游戲受到儲存帶寬的限制,則意味着游戲在操作GPU快速處理大貼圖。可以通過以下方法來確定是否是存儲帶寬的問題:

  1、運行游戲,分析GPU的時間;

  2、 在unity 的Quality Settings中減少當前平台和目標對象的貼圖質量;

  3、再次運行游戲,檢測游戲性能是否有提升,如果有,則意味着可能是內存帶寬造成游戲的性能問題。

  如果是游戲的內存帶寬造成游戲的性能問題,則需要減少貼圖的內存占用來提高游戲的性能。當然不同的游戲解決方法不同,但是有一些通用的方法可以采用:

  1、貼圖壓縮 貼圖壓縮可以極大的減少貼圖在磁盤和內存中的占用率。如果游戲的內存是我們的限制因素,則壓縮貼圖可以提高游戲的性能。在貼圖的壓縮中有不同的格式,每種格式都有特定的設置。所以需要不斷的測試和實驗來找到適合游戲的格式,這兒有如何在unity中設置貼圖的格式的一些介紹。

  2、多級貼圖(Mipmaps)是unity中對於較遠的objects的一種技術,如果場景中包含較多的較遠的objects,我們可以運用Mipmaps技術來解決存儲帶寬的問題。這兒介紹了如何在場景中查看多級地圖的使用效果,這兒對於貼圖的mipmaps有更為詳盡的介紹。

       三、頂點計算

  頂點計算是指GPU必須對每個網格上的頂點進行的計算操作,頂點計算主要受到兩個因素的影響:需要計算的頂點數量,每個頂點需要進行的操作。

  如果GPU的性能問題不是來自內存帶寬或者像素分辨率,則有可能就是頂點計算造成,此時減少需要渲染的頂點數量可以提高游戲性能。

  在減少頂點數量和頂點的操作計算上有一些方法可以提供:

  1、首先需要剔除不必要的復雜網格,對於不在視圖中的物體,不需要過多的細節網格。對於復雜的包含較多頂點的網格也可以進行簡化來避免GPU的浪費。最好的解決辦法就是創建面數較低的模型來替代高模。

  2、 我們可以采用法線貼圖的方法來使得貼圖有一種更復雜的幾何度,盡管這會造成一定的GPU復雜度,但是這對於游戲的性能的提升有較大的幫助。這兒有一些對法線貼圖的介紹。

  3、如果游戲中的模型網格沒有使用法線貼圖,則可以在導入設置的時候剔除切線頂點來減少頂點數量。

  4、LOD(level of detail)技術可以用來減少較遠網格的復雜度,通過減少需要渲染的頂點數量同時不影響游戲的表現效果。LOD Group對於LOD技術有詳盡的介紹。

  5、 shader中的頂點着色器主要用來處理頂點計算,如果游戲受到頂點計算的限制,則減少頂點計算的復雜度可以提高游戲的性能。 如果我們采用內置的shader,則最好采用最優化的shader來進行游戲的特效設置。如果游戲采用特制的shader,則最好對其進行優化,參見上文的分辨率設置。

總結

  通過全文,我們學習了unity中的渲染原理,怎么解決和定位渲染的問題,提供了一些解決的辦法和途徑。通過運用分析工具,我們可以定位造成游戲性能的問題,通過優化可以讓游戲更加順暢的運行。

  后續我會繼續翻譯一些Unity中的優化方法,比如內存管理機制的問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM