天天看點

3D遊戲中的畫質與效率适配

衆所周知,由于不同的裝置配置不同。導緻其cpu和gpu處理能力有高有低。同樣的遊戲想要在所有裝置上運作流暢且畫面精美,是不可能的。這就需要我們針對不同的裝置能力進行畫質調節,以保證遊戲的流暢運作。

想要得到我們需要控制什麼,隻需要找出影響遊戲運作效率的點即可。 當然在此不能一一列舉出所有遊戲類型的點。但筆者就個人經驗,列出一些能用點。

*貼圖精度

*渲染面數

*材質複雜度

*粒子數目

*陰影品質

*水面效果

*增強性場景互動

*引擎後期效果

下面,我們就一個點一個點來說明原因,并給出常見的優化方法。

貼圖精度影響的是tex2d、texcube等采樣指令的速度。對于顯示卡較次的機器來說,可能會是一大瓶頸。一般的引擎都提供了skip mipmap的能力。

skip mipmap即在上傳貼圖資料的時候,跳過指定級數的mipmap。 這樣在shader中進行通路時,使用的就是低級别的貼圖精度。 比如,一張1024x1024的貼圖。 skip mipmap設定為1。表示要跳一級mipmap。 那shader中采樣的時候。最大分辨率将會是512x512。

渲染面數與draw call數目,會受gpu位寬、gpu頻率限制。 當超出負載時,幀率會驟然下降。 這就要求我們需要對渲染面數有一個很好的控制。常見的控制手法有3種

1、減小裁剪距離

     剪裁距離的減小,會将遠處的景物裁剪掉。 進而減少draw call和送出的面數。

     注:這裡說的減小裁剪距離,一定是和視錐體裁剪時一起使用,當靠錄影機的far clip plane,作用很小。

2、模型lod

     随着距離的增加,景物的細節會看不清。此時我們可以減少細節。

     注:lod的切換,可以是兩個政策分管。 一是距離,二是根據機型配置。 取距離計算結果和機型配置結果中最大的lod等級。

3、隐藏細節

     場景中的景物,根據主次關系進行标記。不同的主次關系的景物,受不到同的裁剪距離的影響。 比如,地表可視距離為1000,樹木可視距離為800,花草可視距離為500。

     注:主次細節的顯示與否,可以是兩個政策分管。一是距離,二是根據機型配置。距離計算結果和機型配置結果都需要顯示時,才顯示。

材質複雜度是整個畫質和效率控制系統中的大頭,畢竟大部分的開銷都因材質而起。歸根結底,材質複雜度的控制,就是切換不同的shader。 使得gpu運算複雜度降低。筆者參與的引擎和遊戲開發項目中,遇到過兩種。

1、宏控制的shader編譯

     宏控制的shader編譯,是指在shader中使用一些宏定義。在對shader進行編譯時,将裝置定義的宏開關附加到shader代碼頂部,編譯器根據宏内容進行編譯。 這個方案的優點是,一套代碼适配多個裝置配置。但這個方案也有一個缺點,就是如果要進行實時切換,則會觸發shader的重新編譯。如果是手機項目,一般都是啟動的時候進行硬體檢測,選擇最适合目前機型的編譯配置進行材質的初始化。 而對于端遊等項目,則需要考慮動态切換問題。

     注:這個方案,彙編級的shader不支援。 比如dx asm、stage3d agal。 

     ps:筆者曾經工作的公司的一個自研手遊3d引擎是用的這個方案,十分好用。 前提是中間不要讓玩家切換畫質。

     pps:unity3d也支援這種方案。

2、切換technique

     這是基于一個材質擁有多個technique,且technique不是用來區分材質。 也就是說,在這種情況下,material作為區分一個模型材質的單元。 其内包含的technique用于做裝置的性能适配。這樣的方案下,不同的情況下,需要切換高中低配置時,隻需要切換technique即可。

     注:這個方案,常見引擎都支援,如ogre,unity3d。

一個粒子特效可能有一個或者多個發射器構成。這樣的話,我們可以為每一個發射器指定一個lod等級(如果不支援額外添加資料的,可以通過發射器名字加字首,比如 lod0_fire0,lod1_fire1等)。 我們再根據玩家的選擇或者配置禁用發射器。以達到減少粒子計算和渲染的開銷。

陰影無疑是增強畫質的一個有利武器。 但是當玩家機器配置無法為陰影品質買單時,就隻有選擇性關閉了。 比如,可以給npc,怪物,boss,其他玩家,玩家自己都配置一個陰影标記。 一般有 實時陰影、腳底黑圈、關閉 三種。再根據機型配置或者玩家選擇進行動态的開關各機關的陰影。

陰影的效率開銷還受另外一些參數的影響。比如shadow map的分辨率,是否要使用軟陰影等。

水面效果一般有以下4種

1、實時折射  + 實時反射 ( 現在的主流配置)

2、實時反射(早期一些mmorpg使用)

3、普通水面+cubemap反射(絲路傳說那種)

4、普通半透明水面(wow早期那種)

如果都實作了,那根據玩家選擇即可。 和lod一樣,取玩家選擇和配置的最大值。

比如,地上的小鳥在來回走動,玩家跑過時,會驚飛。 又比如,玩家進入草叢時,草叢會因為受玩家力的影響左右晃動。

這樣的一些細節,着實令整個世界顯得更加真實。 但cpu和gpu的額外開銷,也是一筆不小的賬。 是以,提供一個配置,供玩家和機型開關。

引擎後期效果,如bloom,hdr,熱力扭曲等,都會帶來不小的開銷。 提供開關讓玩家或者機型配置即可。

我們不指望自己的遊戲在每一個玩家的機器上,都美侖美奂。 但我們希望自己的遊戲,能夠流暢的運作在每一個玩家的機器上。 這樣至少給了玩家一次體驗這個遊戲的機會。 如果玩家願意為這個遊戲更新自己的配置,那又何嘗不是一件值得讓人驕傲的事!

簡介:09年入行,喜歡遊戲和程式設計,對3d遊戲和引擎尤其感興趣。 

版權聲明:本文版權歸作者和部落格園共有,歡迎轉載。轉載必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。

轉載:http://www.cnblogs.com/geniusalex/p/5277837.html

繼續閱讀