主頁 >  其他 > Unity 性能調優技術集錦

Unity 性能調優技術集錦

2021-08-03 08:31:06 其他

性能調優,一直是游戲上線之前的很重要的一個環節, 游戲幀率過低,手機發燙, 低端機上跑不起來等, 這些都需要來做優化,今天我們來給大家分享Unity做性能調優的指導思想與解決方案,

這里有個unity學習交流小組點擊可以直接加入,一起學習交流吧

性能調優的指導思想

接觸過很多剛做性能調優的小伙伴,他們做性能調優最大的問題一開始就通過猜測,推斷來做性能調優,缺乏一個做性能優化的系統指導流程, 導致優化的效果不好,性能調優首先要分析問題,定位問題,證明是這塊有問題后再對癥下藥,著手優化,拿出解決對策,沒有證明問題之前,不要隨便動手優化,就像醫生,看病做手術前先做檢查,不確定問題就隨便開刀,那是極不負責任的做法,

大家可以回想一下,當幀率低的時候,你馬上就是去查Drawcall,去優化降低Drawcall,這里我想說,做性能優化之前,先定位,證明確實是Drawcall的問題導致性能下降,才動手,如何來定位問題,找出引起問題的代碼或物體呢?接下來給大家介紹一些方法,

(1)對比法

例如, 剛開始的時候幀率是60FPS,同一個場景運行一段時間以后是30FPS,如何優化,像這種符合很明顯的對比場景,我們可以通過前后對比,來找出60FPS,30FPS,最大的變化,一般可以通過打開stats, 來觀察前后主要的變化,main thread耗時,render thread耗時, 三角形面數,記憶體等資訊,看看前后明顯發生的變化,看到資料變化以后,再來思考整個程序中代碼做了哪些事情,出現過哪些物體,最可能出的問題的地方,然后再證明, 只有證明了問題的存在,再著手優化,

(2)隔離法

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

(3)反經驗法

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

優化架構, 標準規范化開發流程

好的框架設計,不僅讓大家能很好的在一起作業,同時更方便我們快速的反應和定位問題,你的專案不好定位問題,那么一定是框架設計做的不好,所以開始做專案的時候,框架設計要花點時間,模塊盡可能的獨立,模塊入口盡量清晰,整個框架設計能很好的隔離錯誤的蔓延,資源視圖與邏輯代碼分離,游戲資料與代碼邏輯分離,這些都有助于快速的定位問題,比如我要驗證是否物體過多,導致性能問題,只要在表格上配置一下,少放一些物體就可以驗證,如果覺得是某個功能,導致消耗CPU,可以把物體的這個功能的組件關倍訓不添加,比如懷疑怪物AI,可以注釋掉添加怪物AI的組件,來證明,好的框架設計,在定位問題的時候,就變得非常簡單,如果是ECS,定位會更加簡單,記憶體看Entity與資源,演算法性能看System與物體規模……

接下來要給大家介紹的是我認為最重要的經驗,就是標準化,規范化專案開發進度和流程, 把性能問題一開始就放到日常專案開發中,我帶專案的時候,每個禮拜至少做一次發布版本的測驗,包含各個平臺,不同的手機等,嚴格監測性能各項資料,哪個禮拜出現性能問題,馬上可以回溯,復盤資料,著手摸清楚并解決,盡快修正,專案立項后,盡快的驗證核心玩法極限時的性能開銷與測驗,不要等游戲專案做完了,才去驗證,在設計初期驗證完成后,針對一些性能問題組織技術公關,可能還要修改策劃需求和玩法, 早期把性能問題盡快越早摸清楚,是確保整個專案成功上線的關鍵,不要等到上線了才到各平臺做測驗,那個時候功能多了,不知道有些問題是從什么時候開始就有的,標準的嚴謹的開發流程,伴隨專案監控性能資料,盡快驗證核心玩法,提前引入測驗, 讓我們整個專案開發做到有問題盡早發現,盡早糾正,

Unity 性能優化方法集錦

講完指導思想,和開發流程這些宏觀問題后, 我們再來討論一些具體問題的常用的優化方法,

(1)包體體積優化:

聲音檔案優化

將wav,壓縮成mp3或ogg, 最好是ogg,沒有著作權問題, 將多聲道變成單聲道,改變聲音的采樣率與碼率,減少聲音檔案體積,

字體檔案優化

盡量多使用系統字庫,這樣不用額外帶字體檔案,可以使用一些位圖字庫,來替代額外的字庫,如果你的文本內容是固定的,可以對字庫進行裁剪,把不用的字從字庫里面洗掉掉,減少自帶字庫的體積,

貼圖檔案大小優化

將png轉jpg, 并使用圖片壓縮軟體,壓縮貼圖體積, 盡量減少圖片數目,復用圖片,盡量能使用顏色等代碼的方式來代替貼圖,

3D模型檔案

根據需求適當降低模型面數, 去掉多余不用的資料, 可以通過法線貼圖,高度貼圖等將低模做出高模的效果, 合并貼圖通道資料(PBR作業流中,將金屬度,粗糙度,環境遮擋放一個紋理里面, 將資料合并到貼圖不用的通道,比如Albedo貼圖,Alpha通道不用,可以存放環境遮擋等,節約貼圖數目),

將資源ab包化

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

(2): 骨骼影片優化:

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

(3): LOD的優化:

對于大規模多角色的場景游戲,我們要開啟LOD,讓遠處的物體用盡量少的面,近處的物體用更多的面, 來提升我們運行時候的性能,

(4): 使用3D模型細節增強,提升計算性能:

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

(5): 光照優化:

靜態光照烘培+反射探頭來做更好的場景效果,代替實時的光照計算,減少光源的數目,對于一些物體的發光特效,可以通過shader來實作,而不用加光源,定制Shader,可以將逐像素光照改為逐頂點光照,節約逐像素光照的計算開銷,

6: SetPassCall與Drawcall優化

SetPassCall

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

DrawCall

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

(7): 物理引擎的優化:

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

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

(8): 陰影的優化:

通過開關控制陰影,在低端機上關閉陰影獲得更好的運行幀率,在高端機上開啟陰影,獲得更好的運行效果,通過偽陰影技術來做貼圖,節約陰影計算的開銷, 可以自己定制Shader來實作高性能的陰影效果,

(9): Shader優化:

減少Shader中的條件判斷和展開回圈,來獲得更好的指令緩沖cache 命中率, 減少一些復雜的計算,可以采用一些空間換時間的方法來快取計算結果,逐頂點計算來替代逐片元的計算,減少計算次數,可以把Shader 設定為常駐記憶體快取,這樣節約SetPassCall所帶來的開銷,

10: C#良好編碼習慣與演算法思想

Update里面盡量不要使用GetComponent, Find等,可以在初始化的時候先找出來,能放Update里, 盡量不放FixedUpdate, 這樣低端機上能節約計算次數,全域設定,降低FixedUpdate每秒呼叫迭代的次數,節約FixedUpdate迭代時的計算時間,避免大量反復的new 物件,一些重復使用的物件,可以通過節點池等先反復使用,避免重復創建與釋放,

可以用多執行緒來做一些計算,避免卡住main thread游戲執行緒導致幀率下降,不要在游戲主執行緒里面直接做同步的IO以免卡住游戲執行緒,導致幀率下降,

從開始寫代碼起,要把每行代碼寫好,長期的堅持積累,才能形成良好的代碼習慣,寫出高性能,高質量,高效率的代碼,學好資料結構與演算法,能很好的分析演算法的時間復雜度,空間復雜度等,

經過上面的一些討論,可能還會有很多優化技巧,歡迎大家留言討論,同時我們有很多免費的Unity 性能優化的視頻課程,供大家可以學習,成為優化優化的高手,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/291577.html

標籤:其他

上一篇:C語言實作三子棋游戲

下一篇:#自制游戲#遠古版本

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more