Drawcalls:這個東西值越小,你的遊戲性能越好
介紹:在遊戲中每一個被展示的獨立的部分都被放在了一個特別的包中,我們稱之爲“描繪指令”(drawcall),然後這個包傳遞到3D部分在屏幕上呈現出來。這就和你希望你的親友收到準備好的聖誕禮物需要包裝好然後穿過城市準時放在他應該出現的地方一樣沒什麼不同。你的CPU來完成包裝和傳遞他們的活,同時會消耗很多的帶寬,所以最終分配好這些關鍵性資源很重要。目前,真正可怕的事情是從描繪指令消耗遠景開始,每一個獨立的飛濺到地板上的血跡和一個角色或者一具死屍消耗的字節是一樣的多的:他們都消耗同樣的描繪指令。除此之外,沒有什麼更多的差別
降低DrawCalls:
那麼如何降低 draw call呢??那麼我們就用到Culling(剔除)技術。如果不應用這個技術,電腦是不管3721把場景裏所有的東西都送去渲染的。看得見的也渲染,看不見得照樣也送去渲染。很傻是吧,那咋辦呢。得告訴電腦,那個你
看得見的渲染,看不見的就算了。於是就有了
1.視錐體剔除(Frustum Culling)這個unity系統自帶了好像,就不用操心了。
2.遮擋剔除(Occlusion Culling)
渲染調用(Drawcalls)
每個物體的一個不同的材質都會引起一個單獨的Drawcall調用。每一次Drawcall都會引起引擎的一次額外開銷,所以在關卡任何點觀察時都要避免超過2000次的Drawcalls
不同的材質應儘量少的使用
合併一些紋理(例如:如果你在同一個物體使用使用了2個不同的512x256的紋理,應該把它們合併到1張512x512的紋理裏)
正方形的紋理會更好的應用到紋理流
每個物體儘可能使用越少的不同材質,對象的每一個材質都會引起至少2次的Drwacall,如果開啓陰影就是3次
延遲渲染使用,延遲渲染在CPU方面的開銷比前臺渲染開銷要小的多,主要開銷只在GPU渲染方面。而之前前臺渲染的多次Drawcall可以用延遲渲染統一的一次屏幕Drawcall替代。
場景複雜度
通過關閉的門將房間隔離開
使用過渡區域
爲沒有遮蔽的環境使用霧效
對於大物體使用Visblocking/occluders
在特別多對象的區域調整減小可見區域
刪除player看不到的地型
平滑地表以減少頂點密度
爲每個物體調整可見範圍
設置最大drawcalls警戒值爲2000,或者更小
地表儘量使用越少紋理越好
避免多種材質重疊
不要覆蓋多個非常大的透明層(transparent)或者添加層(additive)
爲美術資源設置合適距離的LOD範圍。
CPU性能
使用盡量少的複雜的材質(性能成本便宜的)
在cbuffer中儘量少的三角形(節約drawcalls,減少drawcalls的衝突)
限制cbuffer中的覆蓋的區域
減少動畫角色的骨骼數
不要使用角色動畫模糊(蒙皮需要更多的骨骼)
謹慎使用texturestreaming(需要解壓縮)
儘可能少的在天氣效果中使用通明混合的物體(CPU計算霧效的近似值)
物理代理體儘量使用三角形(要做碰撞檢測)
謹慎使用可破壞的物體
GPU性能
與分辨率無關的:
使用盡量少的頂點渲染.(每個頂點是一個獨特的位置和紋理座標點)
使用一個不太複雜的頂點格式
使用盡量少的會投射陰影的燈光
謹慎使用Decals
與分辨率有關的:
渲染對象在屏幕上佔用儘量少的象素
使用成本較低的pixelshader(較小的燈光,較少的shader特性如反射,簡單的shader)。
場景中每一種材質使用盡量少的紋理
使用廉價的紋理格式(要儘量使用壓縮的DXT1,DXT3,3DC/DXT5)
使用mipmap
AlphaBlend比AlphaTest要慢,而AlphaTest又比不透明渲染的物體要慢
延遲渲染的燈光要比正常的燈光要廉價,所有的光影響的半徑應儘量的小
如果需要一些燈光在一些區域的時候(如Box區域),這會導致燈光大量的重疊,使用IrradianceVolumes是非常必要的
儘可能少的同時開啓多種後處理效果,另外一種策略是減少後處理效果開啓的時間。
不使用或使用開銷小的全屏抗鋸齒(MSAA/FSAA)
使用勁可能少的天氣效果
使用盡量少的地形材質混合。
內存使用:
使用盡可能少的貼圖
使用一個低分辨率的紋理分辨率
使用紋理壓縮格式(DXT1最好,DXT5和3dc也是不錯的選擇)
使用盡可能少的頂點
使用盡可能簡單的物理替代體
使用盡可能少的動畫
使用盡可能少的模型或LOD層級
使用盡可能少的材質和粒子發射器
使用盡可能少的道路
謹慎使用貼花
使用盡可能少的可投射陰影的光源
紋理流:(與紋理傳送帶寬相關)
可流化的紋理應該是正方形大小的(寬和高相等如:1x1256x256)最好
使用盡可能少的不同文理格式用來更好的做紋理池的統一管理
每個區域儘可能少的使用獨特的大紋理來減少I/O帶寬的耗費
嚴格遵守每平方米texels(個數)的規則(distance streaming是基於它的),使用r_texelspermetter 1來檢查它
不要嘗試使用大於512x512的紋理大小(拆分一些大的紋理成小的紋理)
嘗試避免使用小於128x128的紋理單元(這會引起內存碎片),把同一區域的小紋理拼接他們成一個大紋理
如果你仍堅持使用大的紋理集(textureatlases)(不建議),確保你不會使用這些物理到場景的不同區域(例如植被)
通用的程序性能準則:
越簡單的材質使用越精簡的紋理
附加物(Attachments)應該是可調整的,當在屏幕上過小是應該不顯示他們
眼睛根據距離是要關閉的,以減少眼球渲染上的消耗(如果把渲染眼睛的情況下)
可摧毀的物體應該儘量讓避免過快的散開(我的理解是爆炸的破損物體儘量散落的要慢,不要設置成太小的破壞體?)
紋理展開時應該使用越少的頂點(展開成大塊)
貼花要謹慎的使用
制訂紋理分辨率(根據不同範圍設置適當比例)
設置阻擋地帶體來減少物體渲染個數
靜態場景中使用Protals可以帶來更好的效率
Blocky geometry helps to get more for the same vertexcount.(理解不了)
重用幾何體與紋理來減少內存使用
避免在場景中使用獨特的細節(尤其是一些複雜的場景中)
需要多遍渲染的材質層比正常的要慢,謹慎使用
在導出之前手動做ResetXFrom和ResetTransformations操作,如果不做,這些值會被引擎檢查出來生成斷言,比如物理模型與渲染幾何體不匹配。
原點應該在物體的包裹盒內部以避免與預期不一直的渲染結果
跟蹤解決控制檯輸入窗口顯示的所有關卡錯誤級別的錯誤。
渲染調用(Drawcalls)
每個物體的一個不同的材質都會引起一個單獨的Drawcall調用。每一次Drawcall都會引起引擎的一次額外開銷,所以在關卡任何點觀察時都要避免超過2000次的Drawcalls
不同的材質應儘量少的使用
合併一些紋理(例如:如果你在同一個物體使用使用了2個不同的512x256的紋理,應該把它們合併到1張512x512的紋理裏)
正方形的紋理會更好的應用到紋理流
每個物體儘可能使用越少的不同材質,對象的每一個材質都會引起至少2次的Drwacall,如果開啓陰影就是3次
延遲渲染使用,延遲渲染在CPU方面的開銷比前臺渲染開銷要小的多,主要開銷只在GPU渲染方面。而之前前臺渲染的多次Drawcall可以用延遲渲染統一的一次屏幕Drawcall替代。
頂點個數
在引擎中UV邊界會增加頂點個數,使用盡量少的UV邊界
頂點法向量會在一些硬邊被分割,保證平滑的多邊形減少硬邊的數量
物理代理
良好的物理代理在降低CPU物理計算時間上是非常重要的,如果沒有物理代理性能會變慢
使用簡單的物理代理體替代渲染模型來處理物理計算,減少CPU物理計算時間
渲染幾何體的物理計算應該只被應用於一些可破壞的三維體,如可破壞的樹幹
物理代理替應儘量使用(圖元)Primitives
儘可能利用粗糙的物體代理體處理角色碰撞和渲染集合體與子彈的碰狀檢測
爲每個物理代理替使用一組平滑體(只有軟邊緣)
在材質編輯器的3d Package中設置物理類型(Set the proper physics type in thematerial edtior of the 3d package)
閉塞代理
爲大的物體設置角色視覺遮擋,使用閉塞代理替,使用單面的閉塞代理(因爲默認多邊型被視爲雙面),儘可能的簡單,越少三角形越好
物體的LOD
爲每個美術資源設置LOD層級,每個LOD的層級中的多邊形個數必須至少減少P以上。利用3DMAXd的Instancing和reduction修改器
減少LOD岑寂的材質數於節省Drawcalls
良好的LOD是的良好性能和良好資源外觀的關鍵。
材質設置
使用盡可能少的材質數量
合併紋理減少材質數和紋理提取
保持所有紋理使用CryTIF格式
使用128/128/128作爲默認漫反射顏色
使用簡單的灰色128/128/128或快速的色彩紋理做早期的紋理大小的實驗,以獲取一個合適的內存開銷的解決方案
確保所有紋理都做過性能檢測
植被
在室外遊戲中,植被是一個植被覆蓋場景中非常大的開銷,確保每棵數不超過1或2個drawcalls
減少植被物體的材質數以節省Drawcalls
只使用最優化的shader在植被物體上
減少多邊型個數,因爲這些物體會被在屏幕上繪製很多遍
合併文理以減少材質數和最少的紋理提取(texturefetches)
爲樹葉添加多邊型以匹配文理減少overdraw(遮擋繪製),在樹幹上使用面片
粒子
儘可能使粒子特效有效,因爲他們會帶來很大的開銷,對性能有很大影響,此外,儘可能的在不影響視覺的條件下用簡單粒子替代標準粒子以減少性能開銷
FrameTime:
如果你的FrameTime的目標是每秒30幀,那麼每幀的消耗不應該超過33耗秒。
可以使用r_DisplayInfo2來檢測幀時間,或者開啓性能評測模式(profile =1)。
幀速率 = 1.0/1秒中的幀時間。例如1.0/0.033(3) = 30。
GPU時間是非常依賴於屏幕的分辨率,如果使用FSAA和render target的格式,例如720P(1280x720)並且HDR關閉。越高的設置,性能越差。
具體而言,這以爲着對於XBOX360,如果你花費5毫秒做Zpass,6毫秒做一般pass,10毫秒做陰影處理(如果開啓這個功能的話),這加起來大概花費21毫秒,理論上GPU上的幀速率不會超過47幀。
非延遲渲染光照的開銷
太陽光的渲染使用一個簡單的Pass
點光源的渲染使用一個單獨的Pass,可以被合併,最多一個Pass處理4盞燈
聚光燈渲染總是使用單獨的pass
這以爲着如果你場景有陽光,你添加一個點光源,對於每個物體會帶來額外的Drawcalls的光源影響。額外的Drawcall開銷意味着更多的數據需要被處理在CPU方面,每個drawcall會帶來更多的填充率開銷
限制紋理數
Shaders讀取紋理對於主機類和老PC硬件是非常昂貴的
儘量使用DiffuseAlpha的Shader中Gloss選項來替代發光貼圖(GlossMap)。這將節省一個着色器的紋理讀取。你可以安全的使用不必擔心任何質量的損失。如果你使用這個功能並且你的光澤只有單色調,你可以通過高光顏色(SpecularColor)中的顏色材質參數來調整。
對於植被的shader,使用Merged Textures選項。對於葉子這意味着GlossMap紋理的RGB通道包含了你的透明度RGB通道,GlossMap Alpha將會包含你的灰度光澤信息。對於樹幹意味着DiffuseAlpha包含了你的灰度光澤信息。請不要忽視這點,因爲它對GPU(減少讀取開銷)和CPU(更少的設置紋理採樣的開銷)兩方面都有好處。
正確的使用Shader着色器選項
使用Grass ShaderGeneration選項當你做草渲染的時候,這個選項是非常便宜的渲染方法,會生成所有陰影、使用最少的紋理讀取,正確的使用這個選項是非常重要的,尤其是對主機遊戲。
使用Decal shadergeneration選項當你把一個材質當作貼花使用時。這對於確保適當的渲染非常重要,比如你要避免Z-fighting(Z競爭)在某些硬件和一些渲染條件下。另外延遲渲染(deferredrendering)將只能正常渲染不透明幾何體/地表層/貼花,如果沒有啓動這個選項,你要重新讀取Normal Map並再次渲染和計算霧效。
Water/Rivers Volumes
當使用Water volumes和水下霧效的時候,如果是淺水應將density設置爲0。這樣可以跳過霧效處理。
在在小範圍可見區域內使用WaterVolumes,如果要覆蓋一個大區域的話儘量使用小塊進行替代。