Unity性能優(yōu)化

http://www.itdecent.cn/p/3b285110069f
https://blog.csdn.net/e295166319/article/details/79107399《第16章 Unity中的渲染優(yōu)化技術(shù)》

  • 角色模型面數(shù):一個(gè)角色移動(dòng)平臺一般300 ~ 1500面,PC平臺一般1500~ 4000面。

  • 模型骨骼數(shù):一般不多于30個(gè)骨骼


    https://docs.unity3d.com/Manual/ModelingOptimizedCharacters.html
  • Draw Call計(jì)算公式
    http://www.cnblogs.com/zhaoqingqing/p/4623839.html
    在來談到 Batch,其實(shí)也是 Draw Call 的另一種稱呼。你可以想成每一次的 Draw Call 會(huì)產(chǎn)生一個(gè) Batch,而 Batch 里裝的是物件頂點(diǎn)信息,Batch 由 CPU 通過 “驅(qū)動(dòng)程序” 將頂點(diǎn)信息送往 GPU,GPU接手后將物件畫在畫面上。由此可知,越多 Draw Call,CPU 就越忙碌。這下更清楚知道 Draw Call 數(shù)量所影響的是 CPU 效能而非 GPU。
    NVIDIA 在 GDC 曾提出,25K batchs/sec 會(huì)吃滿 1GHz 的 CPU,100% 的使用率。所以他們推出了一條公式,來預(yù)估游戲中大概可以 Run 多少個(gè) Batch:

    Draw Call計(jì)算公式

    Draw Calls = 25K * GHzcpu * Percentcpu / FrameRate ;
    舉個(gè)例子:如果你的目標(biāo)是游戲跑30FPS、使用2GHz的CPU、20%的工作量發(fā)給Draw Call來使用,那你每秒可以有多少Draw Call呢?
    333 Batchs/Frame = 25K * 2 * 20% / 30 .

性能優(yōu)化最直觀的目標(biāo)是提升幀率,幀率可以理解為我們常說的刷新率,通常用FPS表示,即游戲每秒鐘的刷新次數(shù)Frames per second.

用幾個(gè)數(shù)字大致了解性能優(yōu)化的目標(biāo):

  • FPS = 1/ T ; T為每幀游戲消耗的CPU時(shí)間。
    通常比較理想的幀率為60,相應(yīng)地,一幀的CPU的時(shí)間為T=1/60=0.016秒;
  • 蘋果A11處理器最高時(shí)鐘頻率大約為 2.5 GHz,其運(yùn)行速度為每秒6000億次浮點(diǎn)計(jì)算,0.6T FLOPS(float point operation per second)。
    以幀率60計(jì)算,A11處理器的運(yùn)算次數(shù)為每幀不超過6000億/60=100億次計(jì)算。
  • 如果將應(yīng)用程序的一次指令集調(diào)用視為一次計(jì)算,可以理解為應(yīng)用程序的Update中的函數(shù)語句調(diào)用次數(shù)不超過100億次。
  • 應(yīng)用程序或者說游戲的一次Update到底有哪些事情在處理?

一次Update的工作:
邏輯+渲染


資源優(yōu)化標(biāo)準(zhǔn)
Mesh動(dòng)態(tài)模型:

  • 面片數(shù)<3000
  • 材質(zhì)數(shù)<3
  • 骨骼數(shù)<50
    靜態(tài)模型:
  • 頂點(diǎn)數(shù)<500
    Texture貼圖:
  • 長寬<1024
    音樂資源優(yōu)化
  • Audio長時(shí)間音樂(背景音樂)壓縮格式 mp3
  • 短時(shí)間音樂(音效)非壓縮格式 wav
    Shader
  • 盡量減少復(fù)雜數(shù)學(xué)運(yùn)算、
  • 減少discard操作

  • Unity渲染統(tǒng)計(jì)窗口:https://blog.csdn.net/linuxheik/article/details/78866677

    Unity 統(tǒng)計(jì)窗口:https://docs.unity3d.com/Manual/RenderingStatistics.html

  • 參數(shù)說明


    參數(shù)說明:https://www.cnblogs.com/umpjls/p/7319480.html
  • 優(yōu)化概覽


    image.png

一、 Draw Call batching
https://docs.unity3d.com/Manual/DrawCallBatching.html
繪制調(diào)用合并,主要有static batching(合并渲染批次)、dynacmic batching、instancing(實(shí)例渲染)
Unity內(nèi)置的批次合并,首先要求要合并的物體使用同一個(gè)材質(zhì)。
1 static batching:靜態(tài)批次合并
靜態(tài)批次合并,是指Unity可以將靜止并且材質(zhì)相同的物體合并為一個(gè)巨大的mesh來渲染。

  • 將游戲?qū)ο笤O(shè)置為靜態(tài)。
  • 使用同一個(gè)材質(zhì)。只有使用同一材質(zhì)的物體才可能被合并。因而,如果想要獲得好的合并效果,要盡可能多的讓不同的物件模型共用同一個(gè)材質(zhì)。
  • 紋理打包。如果有兩個(gè)材質(zhì)球,使用的Shader相同,僅僅是貼圖不同,可以考慮合并這些貼圖到一個(gè)大的貼圖里,這個(gè)過程叫做圖集打包——Texture atlasing。一旦這些貼圖在一個(gè)圖集里,就可以將這兩個(gè)材質(zhì),用一個(gè)材質(zhì)球代替。

2 dynamic batching:動(dòng)態(tài)批處理

3 GPU Instancing:多實(shí)例渲染

GPU Instancing

https://www.cnblogs.com/88999660/p/5541695.html
在Unity中用手動(dòng)方式降低Draw Call

如果我們想減少draw call,在Unity中或者在其他引擎上,可以盡量減少使用的material(材質(zhì))。基本上,這些可以還原為這些簡單的步驟:
1.整理所有的material并且通過他們的shader類型收集他們
2.第二步:對于使用相同shader的材質(zhì),將他們的貼圖做成一個(gè)圖集(Atlas)
3.創(chuàng)建一個(gè)material,它將包含shader和圖集(Atlas)
4.網(wǎng)格的所有UV重新映射,使用Shader適配圖集的坐標(biāo)
5.用映射的網(wǎng)格創(chuàng)建出步驟3的material


二、LOD
Levels of Detail的簡稱,意為細(xì)節(jié)層次。
三、Occlusion Culling
遮擋剔除,Culling Distance。

角色模型
針對角色模型

1. 角色模型
關(guān)閉光照探頭、
關(guān)閉反射探頭、
關(guān)閉接收陰影、一般效果要求開啟投射陰影,但是接收應(yīng)該沒有必要開啟,視情況而定


VBO(頂點(diǎn)緩沖對象Vertex Buffer Objects-是讓APP存儲(chǔ)和操作GPU內(nèi)存中數(shù)據(jù)的一種機(jī)制,當(dāng)GPU處理數(shù)據(jù)時(shí),不需要從CPU內(nèi)存中讀取,可以節(jié)約內(nèi)存帶寬) Total的值是207.2KB,這與場景里沒放物體207.2KB一樣大小,這說明了動(dòng)態(tài)批處理不僅優(yōu)化了CPU的DC,還有優(yōu)化了Memory(內(nèi)存)大?。?/p>


影響因子:
1.光照

  • 光照方程:


    圖片引用:http://www.itdecent.cn/p/2e73fbee0d62
  • 光照方程的加標(biāo)示版本:


    圖片引用:http://www.itdecent.cn/p/2e73fbee0d62
  • 陰影

  1. 霧氣

  2. LOD

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容