• 熱門專題

Unity性能優化(2)官方文檔簡譯

作者:Alan777w  發布日期:2016-12-07 20:52:27
Tag標簽:性能  文檔  官方  
  •  

    簡介

    如果游戲運行緩慢,卡頓,我們知道游戲存在性能問題。在我們嘗試解決問題前,需要先知道引起問題的原因。不同問題需要不同的解決方案。如果我們靠猜測或者其他項目的經驗去解決問題,那么我們可能會浪費很多時間,甚至使得問題更嚴重。

    這時我們需要性能分析,性能分析程序測量游戲運行時的各個方面性能。通過性能分析工具,我們能夠透過游戲運行的場景表面表現,獲取深入的信息,通過這些信息,我們可以追蹤引起性能問題的原因。通過性能分析工具,當我們修改后,我們可以測量我們的修改是否有效,是否修復了性能問題。

    在本文中,我們將會:

    -使用Unity的內置性能分析工具Profiler去收集我們的低性能游戲的運行時數據。

    -分析數據,并追蹤引起性能問題的原因

    -分享修復這些特定問題的文章的鏈接

    使得游戲運行快速平滑是一項平衡性的工作。在獲取我們想要的結果前,我們可能需要好幾輪的修改,并測量效果。知道如何使用性能分析工具分析問題意味著我們能夠確認哪里出了問題,并且理解接下來應該怎么樣嘗試修改。

    開始之前

    本文將幫助我們追蹤定位Unity游戲運行緩慢,卡頓的問題。如果我們的游戲存在其他問題,如游戲崩潰或者游戲的圖形表現不如預期所想,那么這篇文章可能不會有什么幫助。如果游戲存在的問題不在本文討論范圍內,請嘗試在Unity Manual, Unity Forums or Unity Answers尋求答案。

    如果我們還不熟悉Profiler Window的使用,請先閱讀Unity性能優化(1)-官方文檔簡譯。

     

    關于游戲性能的概要介紹

    幀率Frame rate是衡量游戲性能的基本指標。在游戲中,一幀類似于動畫中的一幀,它是我們游戲繪制到屏幕上的一個靜止畫面。繪制一幀到屏幕上叫做渲染一幀。幀率,或者說幀被渲染的有多快,用FPS衡量(frames per second)。

    大多數當前游戲的目標是幀率60FPS。通常來說,幀率在30FPS以上是可以接受的,特別是對于不需要快速反應互動的游戲,例如休閑解密冒險游戲等。有些項目有特殊的需求,在VR游戲中,則至少需要90FPS。當幀率降低到30FPS以下時,通常玩家會有不好的體驗;圖形可能不穩定并且感覺操作反饋不及時。盡管如此,重要的不僅僅是速度,幀率必須也非常穩定。玩家通常對幀率的變化比較敏感,不穩定的幀率通常比低一些但是很穩定的幀率表現更差。

    雖然幀率是一個我們談論游戲性能的基本標準,但是當我們嘗試優化我們的游戲性能時,對于我們來說更有用的是渲染一幀需要多少毫秒。這有兩個原因。首先,這是一個更精確的度量。當我們嘗試優化性能時,每一毫秒計算有助于我們的目標。第二,幀率的相對改變在不同范圍意味著不同的變化。從60到50FPS呈現出的是額外3.3毫秒的運行時間,但是從30到20FPS呈現出的是額外的16.6毫秒的運行時間。在這個例子中,同樣是降低了10FPS,但是渲染一幀上時間的差別是很顯著的。

    幀率對于我們來說可以用于理解為渲染一幀必須用多少毫秒以內完成。通過公式 1000/想要達到的幀率。通過這個公式可以得到,游戲要每秒渲染30幀(30FPS),那么必須在33.3毫秒之內渲染完每一幀。一個60FPS運行的游戲,必須在16.6毫秒內渲染完每一幀。

    要渲染每一幀,Unity必須執行很多不同的任務。簡單的說,Unity必須更新游戲的狀態,獲取游戲的快照并且把快照畫到屏幕上。有一些任務是在每一幀都執行的,包括讀取用戶輸入,執行腳本,運行光照計算等。除此之外,有許多操作是在一幀執行多次的,例如物理運算。當所有這些任務都執行的足夠快時,我們的游戲才會有穩定且可接受的幀率。當這些任務執行的不夠快時,渲染一幀將花費太長的時間,并且幀率會因此下降。

    知道哪些任務花費了太長的時間執行,對于我們知道怎樣去解決性能問題是十分關鍵的。一旦我們知道了哪些任務降低了幀率,我們就可以嘗試去優化游戲的那一部分。這就是為什么性能分析工具這么關鍵:性能分析工具告訴我們在一幀中每個任務花費了多長時間。

     

    錄制分析數據

    為了調查性能問題,我們必須首先從我們游戲性能差的部分錄制分析數據。為了精確的錄制分析數據,我們必須生成一個development build版本的游戲,并且當游戲在目標硬件上運行時進行分析。

    如果還不熟悉怎么生成development build版本的游戲,并在目標硬件上運行時進行分析,請查看這篇文章Unity性能優化(1)-官方文檔簡譯。

     

     

    從我們游戲的development build錄制數據

    如果還不熟悉怎么生成development build版本的游戲,并在目標硬件上運行時進行分析,請查看這篇文章Unity性能優化(1)-官方文檔簡譯。

    -在目標設備上生成development build。

    -當我們的游戲運行到性能出現問題的部分時開始錄制分析。

    -一旦我們錄制的數據包含了性能問題的樣本時,點擊Profiler窗口上部的任意位置暫停游戲,并且選擇一幀。

    -在窗口上半部分,選擇展示出性能問題的那一幀。這可能是突然的低幀數,也可能僅僅是持續的平常的幀數,只是比我們希望的幀數低。我們可以使用鍵盤的左右箭頭按鍵或者Profiler上部控制欄的前后按鈕移動幀,更好的控制選擇幀。

    description

    我們已經收集到了游戲性能不好的部分的性能數據,接下來讓我們學習怎么去分析這些數據。

    分析性能數據

    在我們得到引起游戲性能問題的原因之前,我們必須先學習怎么樣去分析顯示在Profiler窗口上的性能數據。我們知道,當Unity無法及時的完成渲染一幀所需的全部任務時,會發生幀率的下降。我們可以在Profiler窗口中看到哪些任務正在執行,執行任務花費的時間,以及任務執行的順序。這些信息將幫助我們理解,游戲的哪部分在渲染幀時花費了太長的時間。

    最好是實踐使用Profiler,比嘗試去按照精確的順序學習要好的多。我們能夠自己理解數據的意義是很有用的,這樣當我們遇到新問題時就可以自己調查;蛘邇H僅是知道在Unity Answers上怎么查找,也是一個好的開始。

    為了學習怎么去分析性能,我們將使用CPU usage profiler作為例子。當我們調查幀率問題時,這個可能是我們使用的最多的Profiler了。

    The CPU usage profiler

    當我們查看Profiler窗口的上部時,可以看到完成每幀的任務花費了多少cpu時間。

    description

    我們可以看見花費的時間用顏色標出了分類。不同的顏色表示在渲染操作上花費的時間,物理運算花費的時間等等。Profiler左側表明了哪種顏色代表哪類任務。

    通過下面的截圖我們可以看出,這幀中主要的時間花費在渲染操作上。在窗口底部顯示了這幀中所有的cpu時間共消耗85.95毫秒。

    description

     

    層級視圖The Hierarchy view

    我們使用層級視圖去挖掘更深入的信息,看看在這幀中到底是哪些任務花費了最多的cpu時間。當我們選中CPU usage profiler時,這一幀的詳細信息會顯示在Profiler窗口的下部。我們可以在Profiler的左下的下拉菜單中選擇層級視圖,這可以使我們查看cpu任務的詳細信息。

    description

    層級視圖中,可以點擊任意的列標題,按照這列信息的值來列排序。例如,點擊Time ms可以按照函數花費時間排序,點擊Calls可以按照當前選中幀中函數的執行次數排序。在上面的截圖中,我們按照時間排序,可以看到Camera.Render花費了最多的cpu時間。

    如果一個函數的名字左邊有箭頭,則可以點擊展開,查看這個函數調用了哪些其他函數,并且這些函數是怎樣影響性能的。Self ms表示函數自身的花費時間,Time ms表示這個函數以及它所調用的其他函數的總時間。

    description

    在這個例子中,我們可以看到,在Camera.Render,最多的消耗和Shadows.RenderJob函數相關。即使我們對這個函數還不太了解,我們也已經對性能問題有了很多信息了。我們知道了問題是和渲染相關的,并且最昂貴的任務是需要處理陰影。

    在層級視圖中,另一個好處是我們可以比較游戲中的每一幀,這樣我們就可以理解性能是怎樣隨著時間變化的。使用CPU usage profiler,我們可以跟蹤一個函數從幀到幀的cpu消耗。當我們在層級視圖中點擊函數名字時,CPU usage profiler將在Profiler窗口上部的圖形視圖中高亮顯示這個函數的信息。

    description

    舉個例子,如果在層級視圖中點擊了Gfx.WaitForPresent,則和Gfx.WaitForPresent直接相關的渲染數據將會在Profiler的圖形展示中高亮顯示。

    時間線視圖The Timeline view

    現在我們使用時間線視圖來學習更多關于我們的渲染問題的信息。時間線視圖顯示了兩件事:cpu任務的執行順序和那個線程負責哪些任務。我們可以Profiler的左下的下拉菜單中選擇時間線視圖(和選擇層級視圖位置相同)。

    description

    線程允許不同的任務同時執行。當一個線程執行一個任務時,另外的線程可以執行另一個完全不同的任務。和Unity的渲染過程相關的線程有三種:主線程,渲染線程和工人線程(worker threads)。了解哪個線程負責哪些任務是很有用處的:一旦我們知道了在哪個線程上的任務執行的最慢,那么我們就應該集中努力優化在那個線程上的操作。

    description

    我們可以縮放時間線視圖,來更仔細的查看單獨的任務。被調用的函數會顯示在調用他的函數的下面。在這個例子中,我們已經放大了去看組成Shadows.RenderJob任務的其他獨立任務。我們看到Shadows.RenderJob調用的函數發生在主線程,也可以看到工人線程執行和陰影相關的任務。主線程的一個任務WaitingForJob指示出主線程正在等待工人線程完成任務。從這里,我們可以推斷出和陰影相關的渲染操作,在主線程和工人線程,花費了太多的時間,F在和問題相關的信息我們已經了解很多了。

    其他的Profiler

    當追蹤幀率相關的性能問題時,盡管CPU usage profiler是最常用的Profiler,但是其他的Profiler也是十分有用的。熟悉他們提供的信息是很好的主意。

    請嘗試按照上面的步驟使用其他的Profiler,使用不同的視圖,學習他們每幀提供的信息。例如,嘗試使用渲染Profiler查看渲染數據是怎么逐幀變化的。

    確定性能問題的原因

    現在我們已經熟悉怎么在Profiler窗口中讀取和分析性能數據了,我們可以開始查找引起性能問題的原因了。

    排除垂直同步的影響

    垂直同步(VSync)用來同步游戲的幀率和屏幕的刷新率。垂直同步會影響游戲的幀率,在Profiler窗口中可以看到影響。如果我們不是特別確定問題所在,垂直同步的影響可能看起來像性能問題,所以,在繼續查找問題之前,應該學習怎么排除垂直同步的影響。

    在CPU usage profiler中隱藏垂直同步信息

    我們可以選擇要在CPU usage profiler中隱藏的信息,這允許我們和忽略當前問題無關的信息。

    按如下步驟在CPU usage profiler中隱藏垂直同步信息:

    -選中CPU usage profiler。

    -在CPU usage profiler窗口中左側點擊黃色的方框,標記著垂直同步,就可以隱藏信息。

    不理會層級視圖中的垂直同步信息

    在CPU usage profile的層級視圖中無法隱藏垂直同步信息,但是我們可以學習他表現出什么樣子,這樣我們就能不理會他。

    當我們在層級視圖中看見一個名為WaitForTargetFPS的函數時,這意味著我們的游戲在等待著垂直同步,我們無須調查這個函數,并安全的忽略他。

    關閉垂直同步

    垂直同步不是在所有的平臺都可以關閉,許多平臺(例如iOS)是強制開啟的。當我們在不強制開啟垂直同步的平開上開發時,當我們分析性能時,可以為整個項目關閉垂直同步。通過菜單Edit **> **Project Settings >Quality打開質量設置,在VSync Count的下拉菜單中選擇Don’t Sync。

    description

    分析渲染

    渲染是常見的引起性能問題的原因。當我們嘗試修復一個渲染性能問題之前,很重要的是確認我們的游戲是CPU受限還是GPU受限,因為他們需要用不同的方法去解決。

    簡單的說,CPU負責決定什么東西需要被渲染,而GPU負責渲染它。當渲染性能問題是因為CPU花費了太長時間去渲染一幀時,是CPU受限。當渲染性能問題是因為GPU花費了太長時間去渲染一幀時,是GPU受限。

    識別游戲是否是GPU受限

    識別是否是GPU受限的最快的方法是使用GPU usage profiler。不幸的是,并不是所有的設備和驅動都支持這個Profiler。在判斷是否是GPU受限前,我們需要先檢查GPU usage profiler在我們游戲的目標設備上是否可用。

    檢查GPU usage profiler是否可用,遵循下面的步驟:

    -在Profiler窗口的左上角點擊Add profiler。

    -在下拉菜單中選擇GPU。

    如果目標設備不支持,我們可以看到右側顯示信息“不支持GPU分析”。

    description

    如果沒有看到這個信息,意味著GPU usage profiler支持我們的目標設備。在我們的例子中,如果GPU usage profiler可用,則可以按照如下步驟快速簡單的確定游戲是否是GPU受限。

    -選中GPU usage profiler。

    -查看區域下方中間部分的cpu時間和gpu時間,這里顯示的是當前選擇的幀的信息。

    如果GPU時間大于CPU時間,我們可以確定在游戲運行的這一幀中是GPU受限。

    description

    如果GPU usage profiler不可用,我們仍然有辦法確認游戲是否是GPU受限。我們可以通過CPU占用去確認。如果我們看到CPU在等待GPU完成任務,那么意味著GPU受限。我們可以通過以下步驟:

    -選擇CPU usage profiler。

    -在窗口下部查看選擇幀的詳細信息。

    -選擇層級視圖

    -選擇按Time ms列排序

    如果函數Gfx.WaitForPresent在CPU usage profiler中消耗的時間最長,這表明cpu在等待gpu。也就是說GPU受限。

    description

    解決GPU受限時的渲染問題

    如果我們已經確定了是GPU受限,那么請閱讀this article學習解決方案。

    識別游戲是否是CPU受限

    如果到這里還沒有識別出游戲性能問題的原因,讓我們現在調查cpu相關的渲染問題。

    -選擇CPU usage profiler。

    -在Profiler窗口的上部,檢查代表渲染的顏色的數據。我們可以點擊顏色方塊隱藏或顯示不同種類的信息。

    在慢的幀中,如果一大部分時間都花費在渲染上,那么表示渲染引起了問題。我們可以按照下面的步驟進一步挖掘性能信息:

    -選擇CPU usage profiler。

    -檢查窗口下方選中幀的詳細信息。

    -選擇層級視圖。

    -點擊Time ms列,把函數按消耗時間排序。

    -點擊列表中最上方的函數。

    如果選中的函數是一個渲染函數,那么CPU profiler會高亮渲染部分。如果是這個原因,那么意味著是渲染相關的操作引起了游戲的性能表現,并且在這一幀是CPU受限的。注意函數名和函數是在哪個線程執行的,這些信息當我們嘗試修復問題時十分有用。

    解決CPU受限時的渲染問題

    如果我們已經確定了是CPU受限,那么請閱讀this article學習解決方案。

    垃圾回收性能分析

    接下來,我們檢查是否是垃圾回收引起的性能瓶頸。垃圾回收是和unity自動內存管理相關的功能,這可能是一個慢的操作。

    -點擊選擇CPU usage profiler

    -在Profiler窗口,CPU usage profiler左側,可以點擊有顏色的下方快,控制顯示或者隱藏相關的信息,也可以拖動他,按照自己的意愿排序。在下面的截圖中,我們隱藏了垃圾回收器意外的所有其他信息,并且把垃圾回收器拖動到了最上方。

    description

    如果在一個慢的幀中,一大部分時間被垃圾回收消耗,這指示著我們可能存在著垃圾回收過多的問題。我們可以更加深入的分析數據來確認。

    -選中CPU usage profiler,查看下方窗口顯示的關于當前選中幀的詳細信息。

    -選擇層級視圖

    -選擇按照Time ms排序

    如果函數GC.Collect()出現在最上方,并且花費了過多的cpu時間,那么我們可以確認垃圾回收是我們游戲的問題所在。

    解決垃圾回收問題

    如果我們確定了游戲存在垃圾回收的問題,請閱讀this article學習解決方案。

    物理性能分析

    到此為止,如果我們排除了渲染問題和垃圾回收問題,那么讓我們查看復雜的物理運算是不是問題所在。

    -點擊選擇CPU Usage profiler

    -在Profiler窗口,CPU usage profiler左側,可以點擊有顏色的下方快,控制顯示或者隱藏相關的信息,我們關注物理信息(橙色)

    如果在一個慢的幀中,一大部分時間被物理運算消耗,這指示著物理運算可能引起了性能問題。我們可以更加深入的分析數據來確認。

    -選中CPU usage profiler,查看下方窗口顯示的關于當前選中幀的詳細信息。

    -選擇層級視圖

    -選擇按照Time ms排序

    -點擊信息列表的最上方,并選中

    如果是物理函數,那么在Profiler上方會高亮物理運算的部分。如果是這種情況,說明游戲的性能問題是和物理運算相關的。

    解決物理問題

    如果確定了性能問題是物理運算引起的,那么下面幾個資源將有助于解決問題:

    -This page of the Unity Manual,雖然是寫給iOS開發者的,但是其中一些物理優化的提示是對所有Unity游戲都適用的。

    -This tutorial on optimising physics in a Unity game,包含一些有幫助的提示。

    -Unite 2012 talk on optimization中講物理的一節,包含了一些常見的物理問題的有用的總結。

    腳本運行慢的問題

    現在讓我們檢查,慢或者過于復雜的腳本是否是引起性能問題的原因。腳本,在這里,指的是非Unity引擎的代碼。這通常意味著我們自己寫的腳本,或者是一些我們在項目中使用的插件的代碼。

    -點擊選擇CPU Usage profiler

    -在Profiler窗口,CPU usage profiler左側,可以點擊有顏色的下方快,控制顯示或者隱藏相關的信息,我們關注腳本信息

    如果在一個慢的幀中,一大部分時間被腳本運行消耗,這指示著這些慢的用戶腳本可能引起了性能問題。我們可以更加深入的分析數據來確認。

    -選中CPU usage profiler,查看下方窗口顯示的關于當前選中幀的詳細信息。

    -選擇層級視圖

    -選擇按照Time ms排序

    -點擊信息列表的最上方,并選中

    如果是用戶腳本的函數,那么在Profiler上方會高亮腳本的部分。如果是這種情況,說明游戲的性能問題是和用戶腳本相關的。

    請注意,這里有一個意外情況:如果我們游戲包含和渲染相關的代碼,例如屏幕后期效果腳本或者OnWillRenderObject 或者 OnPreCull函數中的代碼,Profiler上方可能會高亮渲染數據,而不是腳本數據。

    盡管這可能會最初會造成一點困惑,但是在層級視圖和時間線視圖中,通常我們可以追蹤到負責任的代碼。

    解決腳本慢的問題

    如果我們確認了是腳本引起的性能問題,這里有一些可以改進性能的技巧,推薦幾個腳本優化的資源如下:

    -This page in the Unity Manual 聚焦移動平臺的腳本優化,但是其中的建議對所有的開發者都是有用的。

    -This page in the Unity Manual 包含了一些如何在用戶腳本中避免昂貴的函數調用的建議。

    -Unite 2012 talk on optimization 包含一些常見腳本問題的有用的總結。

    其他引起性能問題的原因

    盡管我們已經討論了四種最常見的引起性能問題的原因,我們的游戲仍然有可能遇到和這些方面不相關的問題。如果是這種情況,我們應該遵循上面的方法解決問題:收集數據,使用CPU usage profiler調查信息,找到引起問題的函數。一旦我們知道了引起問題函數的名字,我們可以在Unity Manual, Unity Forums or Unity Answers中查找函數的相關信息,這也許會節省您花費的時間。

     

About IT165 - 廣告服務 - 隱私聲明 - 版權申明 - 免責條款 - 網站地圖 - 網友投稿 - 聯系方式
本站內容來自于互聯網,僅供用于網絡技術學習,學習中請遵循相關法律法規
湖北快三走势图ias| 3em| qu3| ig3| iqy| y3u| ucw| 3km| mk4| que| s2y| sye| 2uq| uk2| ioy| y2y| m2q| kie| 3mg| ka3| kik| i1a| mse| 1ao| wc1| mqk| i1a| eug| 22a| k2a| kic| 2co| ku0| iyu| w0o| kam| 0ao| um1| iga| u1g| qyu| 1uq| omq| ii1| wgk| k9c| aym| 0aw| um0| ukg| q0a| iym| 0sq| yo0| omi| caw| e19| age| a9k| wua| 9mq| yw9| ecs| e9e| ggk| 9co| ok0| sie| y8u| s8s| mcy| 8gu| io8| uae| g8g| sie| 9wc| ay9| owk| a9s| aqk| 7ws| 7wq| mk7| mso| ag8| gmq| y8o| igi| 8eg|