優化圖形性能(iOS)

Optimizing Graphics Performance (iOS)

Alpha-Testing

在iOS上使用alpha-testing的開銷非常大,儘量將alpha-test shader替換爲alpha-blend。

Vertex Performance

在iPhone 3GS以及新的硬件上儘量控制每幀渲染不超過4萬個頂點(一萬多個面)。

Lighting Performance

象素級動態光照計算因爲要計算每個受影響的象素而增加大量的計算開銷,也會讓對象渲染多個pass。儘量避免讓多個Pixel Light影響單個對象,儘量使用方向光。Pixel Light指將Render Mode設置爲Important的光。

頂點級動態光照計算會影響頂點變換的計算開銷,儘量避免多個光同時影響單個對象,如果可能的話儘量使用預烘培的光照圖。

Optimize Model Geometry

模型優化的兩條標準:
剔除那些非必要的面,把那些永遠也不會顯示的面刪掉
儘量減少UV映射的接縫和硬邊(hard edge)

注意,圖形硬件實際渲染的頂點數與在3D建模軟件中看到的頂點數不一樣,建模軟件中顯示的頂點數是構成模型的實際頂點數,而在引擎中渲染的時候,一些頂點需要被分爲多個,比如那些有多個法線的頂點,或者是有多個UV座標的頂點以及有多個顏色值的頂點,他們都必須拆分爲多個。所以最終在Unity中看到的頂點數一般都與建模軟件中看到的不一樣。

Texture Compression

儘可能使用iOS內置的PVRT壓縮格式,它不僅能減少貼圖文件的大小,讓遊戲的加載速度更快,並且點用更少的內在,而且還能顯著提高渲染性能。

如果圖像帶alpha通道,使用PVRT壓縮格式後看起來可能會有些問題。如果出現了這種情況可以使用PVRTexTool來生成.pvr文件,這些文件裏帶有PVRT壓縮參數,Unity引擎導入這些壓縮圖像後能夠更好的還原出原始圖像。

如果PVRT壓縮格式完全不能滿足圖像質量方面的要求,比如對於UI貼圖來說,則可以採用16位圖像格式,這也比完全的32位RGBA圖像要節省一半的空間。

Tips for writing well performing shaders

在iPhone 3GS之後,GPU已經開始完全支持頂點shader和象素Shader,但也不能期望在iOS平臺上能夠實現與桌面系統一樣的複雜Shader,iOS的硬件性能畢竟還是受限的。

Complex arthmetic operations

類似於pow,exp,log,cos,sin,tan之類的算術計算會造成很大的GPU開銷,一般來說在每個fragment中儘量不要超過一次這種調用。更好的做法是通過查找texture來獲取數據。

儘量不要使用自己寫的normalize, dot, inverse, sqrt函數,使用內建的,驅動會爲這些函數生成更加優化的實現。

儘量減少discard操作的使用,這會讓fragments變得非常慢。

Floating point operations

使用浮點數時必須指明其大小,儘量使用最小的格式。
如果使用GLSL ES編寫Shader,其數據格式爲:
1. highp 完全的32位浮點格式,適合於頂點變換的計算,速度比較慢
2. mediump 16位的浮點格式,適用於UV座標,比highp快大約兩倍
3. lowp 10位的定點格式,適用於colors, lighting計算,比highp快大約四倍

CG的shader與GLSL ES類似,三個格式爲 float, half, fixed

Bake Lighting into Lightmaps

儘量將靜態光進行預渲染,Unity提供了內建的Lightmapper工具。
使用光照圖僅僅會消耗額外一點點生成時間,但是能夠帶來更多的好處:
1. 在有2個象素級光照的情況下能夠提高2到3倍的渲染速度
2. 更加平滑的光照表現

Share Materials

如果多個物體使用相同的材質被渲染到同一個攝像機下,Unity iOS能夠使用一系列的優化手段:
1. 避免大量的渲染狀態切換
2. 避免因爲不同的參數而導致頂點及象素處理過程的暫停
3. 讓多個小的可移動物體使用同批次渲染以減少draw call數量
讓多個標了”static”屬性的不論大小的可移動物體使用同批次渲染以減少draw call數量

上面的每一步都能夠大量的減少CPU開銷,所以儘可能的把多個小貼圖合併到一張大圖上,讓儘可能多的物體都使用這同一張大貼圖

Simple Checklist to make Your Game Faster

幾個關於優化的檢查點:
1. 在iPhone 3GS及新的硬件上控制每幀最多渲染4萬個頂點
2. 如果使用內建的Shader,儘量選擇Mobile類別下的,其中Mobile/VertexLit是目前最快的
3. 儘量減少每屏可見的材質數量,儘可能的共用材質
4. 把所有不會移動的物體都標註”static”屬性
5. 儘可能的使用PVRTC格式的貼圖,或者16位貼圖
6. 儘可能的使用combiners或者pixel shader來混合多張貼圖,儘量避免採用多個pass的方法
7. 如果自己寫shader,儘量使用小的浮點數格式
8. 儘量避免使用比較費時的算術計算
9. 除非必要不要使用Pixel Light,保證只會有最多一個Pixel Light影響到物體
10.除非必要不要使用動態光,可以使用預烘培的方法來代替
11.使用儘可能少的貼圖數量
12.儘量避免alpha-testing的使用,可以使用alpha-blending來代替
13.除非必要不要使用霧
14.在場景中儘可能的使用遮擋體以減少需要渲染的物體數量
15.使用天空盒來剔除遠處的物體

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章