使用英特尔GPA优化《剑侠情缘三》游戏的性能
郭勝(英特爾開發(fā)者關(guān)系部)?楊林(金山軟件西山居游戲工作室)
介紹
游戲在集成顯卡上的性能日益成為游戲開發(fā)者關(guān)注的一個重要問題。這主要是由于兩方面的原因:一是集成顯卡的功能日益增強,具有越來越強的3D圖形處理能力,支持的3D游戲也越來越多【3】。其次隨著個人移動平臺(如筆記本電腦,上網(wǎng)本等)日益普及,低功耗、高性價比的集成顯卡作為這些平臺上的主要圖形解決方案,將持續(xù)占據(jù)更重要的市場地位。Mercury Research?的報告顯示,在?2008?年,集成顯卡芯片組的銷量有史以來首次超過獨立顯卡;到?2013?年,集成顯卡和獨立顯卡的銷量有望達到?3:1。因此,針對集成顯卡優(yōu)化游戲的性能,有利于提升游戲的用戶普及度,吸引更多潛在玩家。
英特爾的圖形性能分析器(GPA)可幫助游戲開發(fā)人員分析、評估和改進運行于英特爾集成顯卡上的游戲性能【1】。GPA是一套基于?DirectX?的功能強大的工具套件,由系統(tǒng)分析器和幀分析器兩項主要工具組成。它能收集系統(tǒng)平臺和圖形幀的性能數(shù)據(jù),讓您了解系統(tǒng)和單個幀的負載分布,并支持執(zhí)行“假設(shè)性”實驗,評估優(yōu)化所能帶來的潛在性能提升。
本文介紹了一個使用GPA在英特爾4系列集成顯卡上分析和優(yōu)化《劍俠情緣三》【2】網(wǎng)絡(luò)游戲性能的案例。《劍俠情緣三》(簡稱《劍網(wǎng)3》)是金山公司歷時5年自主研發(fā)的大型全3D網(wǎng)絡(luò)游戲,也是國內(nèi)知名游戲品牌“劍俠情緣”系列最新一部作品。依托獲得國家863計劃支持的、自主研發(fā)的游戲引擎,《劍網(wǎng)3》的即時演算效果已達到近似電影畫面水準;人物細膩的細節(jié)展示、花海林間的光影表現(xiàn)等,都已達到國內(nèi)網(wǎng)游頂級水準。
作為英特爾軟件伙伴項目(Intel? Software Partner Program)的成員,金山公司在該游戲開發(fā)過程中獲得了英特爾大量的技術(shù)支持,為了使更多玩家能體驗這款游戲,金山與英特爾在集成顯卡的優(yōu)化上進行合作。GPA在發(fā)現(xiàn)此游戲的性能瓶頸上發(fā)揮了重要的作用。優(yōu)化的結(jié)果使原有的性能在英特爾4系列集成顯卡上提升了近一倍,達到可玩的幀速率,使更多玩家能體驗這款精彩的大型3D網(wǎng)絡(luò)游戲。
性能分析準備
使用GPA測試游戲的性能前,需要設(shè)置兩臺PC。一臺作為分析機,安裝和運行GPA圖形界面的分析工具;另一臺PC作為目標機,配置英特爾4系列集成顯卡,安裝和運行游戲以及GPA服務(wù)端程序。兩臺機器通過TCP/IP網(wǎng)絡(luò)互聯(lián)。
為了便于測試,金山公司專門開發(fā)了游戲的顯卡測試版本。此版本包含該游戲中大量典型的圖形渲染特性。雖然《劍俠情緣三》是一款網(wǎng)絡(luò)游戲,但此測試版本能自動運行在單機上,大大方便了性能分析。
環(huán)境部署好之后,要選擇合適的游戲配置和一個性能上典型的游戲場景作為測試基準。在集成顯卡上,我們使用缺省的最基本的游戲配置,分辨率定為800x600。運行游戲測試版本,我們找到一個在性能和場景復(fù)雜度上有代表性的場景,如圖1所示。注意,Fraps工具在畫面右上角顯示此游戲的初始幀速率為11.
圖1:《劍俠情緣三》顯卡性能測試版場景(此圖經(jīng)金山軟件授權(quán)使用)
測試環(huán)境和典型場景準備好以后,接下來將使用GPA的系統(tǒng)分析器和幀分析器對該游戲進行性能分析。
系統(tǒng)性能分析
GPA的系統(tǒng)分析器提供了一組狀態(tài)覆蓋模式,以及關(guān)于CPU、GPU和DX運行時的多組性能計數(shù)器。使用系統(tǒng)分析器能夠從平臺系統(tǒng)的角度分析圖形渲染管線的瓶頸是否在上述一個或多個域中,并且?guī)臀覀兣袛嗍欠癖匾褂脦治銎鬟M行進一步分析(如果GPU中存在瓶頸的話)。
首先分析游戲的負載分布。GPA提供了幾個狀態(tài)覆蓋模式可以用于評估游戲在圖形渲染管線上主要階段的負載。這幾個狀態(tài)覆蓋模式是:
1.?“Null Hardware”。此狀態(tài)覆蓋模式能把顯卡上的負載去掉,也相當(dāng)于把顯卡的性能提升到無窮大。可以用于評估顯卡負載對幀速率的影響程度。
2.?“Null Driver”。此模式把顯卡驅(qū)動以及其后顯卡硬件上的負載都去掉,可以用于評估游戲應(yīng)用層代碼的負載對幀速率的影響程度。此模式的幀速率同時反映了不修改代碼的情況下,游戲在任何顯卡上(保持CPU和內(nèi)存相同)的性能上限。
3.?“1X1 Scissor Rect”。在IIG實現(xiàn)中,此模式幾乎可以去除顯卡Rasterization階段后的所有負載。使用此模式可以評估象素相關(guān)的負載(包括紋理訪問)對幀速率的影響程度。
下表是上述覆蓋模式和正常模式下系統(tǒng)分析器顯示的游戲幀速率和相應(yīng)的幀時間:
| 覆蓋模式 | 幀速率(fps) | 幀時間(ms) |
| 正常模式 | 11 | 91 |
| 1X1 Scissor Rect | 19 | 53 |
| Null Hardware | 21 | 48 |
| Null Driver | 52 | 19 |
表1:?不同覆蓋模式下的性能
根據(jù)表1,可以評估游戲渲染過程中四個階段對整個游戲幀時間的影響(圖2)。需要注意的是,圖中顯示的每個階段的時間并不是它們實際處理每幀畫面的時間,而是實際處理時間中對整個幀時間有影響的那部分。因為不同渲染負載通常會使這些階段時而串行時而并行,所以它們的實際處理時間可能會更長。每個階段的時間代表了它們的負載。圖中紅線代表此游戲優(yōu)化的目標:20幀每秒或50毫秒每幀。
圖2:測試場景的渲染負載分布
根據(jù)表1和圖2,可以得出以下推論:
1.游戲“Null Hardware”模式顯著改善性能,此游戲的主要瓶頸在GPU。但圖2顯示CPU端的負載也很重,因此性能瓶頸可能存在于渲染過程的多個階段中。
2.象素處理是主要瓶頸之一,對整個幀時間的影響最大。但僅從局部優(yōu)化顯卡上象素處理的負載并不能達到目標幀時間。
3.驅(qū)動的負載在渲染觀察中僅次于象素處理。說明游戲每幀發(fā)送的渲染命令的數(shù)量和(或)數(shù)據(jù)拷貝等開銷很大,需要重點關(guān)注DX的繪制調(diào)用方式。
4.根據(jù)“Null Driver”模式下的幀速率,此游戲場景在任何顯卡上的性能上限是52幀。根據(jù)經(jīng)驗,通常這個值應(yīng)該超過100。說明游戲應(yīng)用層代碼和DX運行時的負載較重。
5.渲染管線的整體負載比較重,需要把總的幀時間優(yōu)化掉一半,才能達到目標幀時間。因此,必須從應(yīng)用層開始進行全局優(yōu)化,減輕整個渲染管線上各個階段的負載。
因此接下來,我們需要分析游戲的DX繪制調(diào)用方式。GPA提供了一組DirectX層的性能計數(shù)器,可以統(tǒng)計程序每幀中的DX繪制調(diào)用、DX狀態(tài)改變和DX鎖調(diào)用的數(shù)量和時間。觀察這些值有助于了解DX層的開銷,以及分析DX調(diào)用行為對渲染管線后端的性能影響。
圖3:系統(tǒng)分析器采樣的DX計數(shù)器的值
上圖顯示,每幀的繪制調(diào)用(DrawCall)大約為1500個,與其他的游戲比,這個值很高,意味著DirectX運行時的開銷會比較重,以及每幀繪制的對象很多。每幀的DX狀態(tài)變化數(shù)有約20000次,可算出平均每個繪制調(diào)用的狀態(tài)變化數(shù)為13次,這個值比較低,因此狀態(tài)變化對性能的影響不大。每幀中調(diào)用的DX鎖和表面鎖的總時間只有0.25毫秒,與整個幀時間91毫秒比幾何可以忽略不計,因此鎖的調(diào)用對性能的影響不大。以上分析指出:過多的繪制調(diào)用是導(dǎo)致整個渲染管線負載過重的主要原因之一。根據(jù)這個判斷,接下來需要使用幀分析器分析這些繪制調(diào)用都做些什么。
單幀性能分析
GPA可以把渲染一個游戲幀需要的信息以及性能數(shù)據(jù)捕捉到一個文件中。幀分析器基于這個文件工作,可以回放場景的渲染過程,顯示繪制調(diào)用的性能數(shù)據(jù)。用戶可以修改繪制調(diào)用相關(guān)的渲染狀態(tài)、著色器以及紋理MIP級別等,這些改變導(dǎo)致的繪制調(diào)用在GPU上的性能變化將顯示在回放結(jié)果上。開發(fā)者使用幀分析器可對游戲幀每個繪制調(diào)用的性能進行分析。圖4是使用GPA幀分析器分析此游戲的界面。
圖4:幀分析器的界面
此視圖中,最上面的“渲染單位可視化面板”(圖4 a)顯示了渲染一幀的所有渲染單位的順序和時間。渲染單位主要指三類DX調(diào)用:繪制調(diào)用(Draw Call),表面清除(Clear)和表面拷貝(Surface Copy)。每個渲染單位都用一個柱條表示,柱條的高度顯示與此渲染單位關(guān)聯(lián)的所有渲染操作(包括狀態(tài)切換等)在GPU上的總時間。與“渲染單位可視化面板”對應(yīng)的是左邊中間的“系統(tǒng)概覽面板”(圖4 b)。此視圖用表格形式顯示每個渲染單位,以及相關(guān)的性能數(shù)據(jù)(如類型,繪制幾何的數(shù)量,消耗時間,新老時間變化等)。可以按不同的性能數(shù)據(jù)對渲染單位排序。選擇“渲染單位可視化面板”和“系統(tǒng)概覽面板”中的條目,都會在左下方的“渲染目標面板”(圖4 c)上顯示當(dāng)前渲染目標的狀態(tài),并且加亮選擇的條目對渲染目標的改變。右下方的“表單面板”(圖4 d)中會顯示與所選條目相關(guān)聯(lián)的各種資源和性能數(shù)據(jù),以及著色器的匯編和HLSL形式的代碼。用戶可以隨時更改這些數(shù)據(jù)(狀態(tài),紋理,著色器等),幀分析器會及時重新計算和更新界面,為用戶評估新的性能。
開始分析游戲幀時,首先觀察“系統(tǒng)概覽面板”中的分區(qū)(Region)。分區(qū)是幀分析器按照渲染目標劃分的。每個分區(qū)包含一組渲染單位。渲染幀的過程中,每切換一次渲染目標,就會產(chǎn)生新的分區(qū)。展開分區(qū),可以看到“0to0”和“1to1”分區(qū)的作用是清除顏色和Z/Stencil緩沖。“2to655” 分區(qū)負載把水面反射的倒映繪制到紋理表面(圖5)。最后的分區(qū)在幀緩沖中繪制整個場景。
圖5:產(chǎn)生水面反射紋理的分區(qū)
從圖形界面底部的性能統(tǒng)計信息(紅色矩形框中)可以發(fā)現(xiàn),“2to655” 分區(qū)占用了41.4%的幀時間,幾乎達到總時間的一半。但最后屏幕上卻看不到水面倒映,因為河流還沒有進入攝像機的視線范圍,所以在此幀中,繪制水面反射倒映是冗余的。這是一個重要的暗示,說明水面反射有很大的優(yōu)化空間。
圖6:根據(jù)GPU時間排序渲染單元
按照每個渲染單元的繪制時間排序,可以找到最耗時的一些渲染單元。在做任何實驗之前,我們先按照OLD Duration降序重排所有渲染單元(圖6)。“系統(tǒng)概覽面板”顯示第1250個繪制調(diào)用的開銷最大,渲染目標顯示這個繪制調(diào)用負責(zé)渲染地形。
圖7:選擇使用地形著色器的所有繪制調(diào)用
使用鼠標右鍵點擊地形繪制調(diào)用關(guān)聯(lián)的著色器,可以把所有使用此著色器的繪制調(diào)用(同時把場景中所有地形繪制調(diào)用)找出來。圖7顯示所有地形繪制占用整個幀時間的10.8%。從繪制調(diào)用ID的連續(xù)性看,游戲基本上是按調(diào)用狀態(tài)分類繪制的,這是游戲已采用的一個良好的編程技巧。
圖8:地形渲染的“SimplePixelShader”實驗
然后做 “SimplePixelShader”實驗,可評估優(yōu)化地形色器程序后,地形渲染性能最多可以改進約48.3%。接著嘗試做“2x2Textures” 實驗,發(fā)現(xiàn)最多只能改進0.7%,因此地形渲染性能的優(yōu)化的重點應(yīng)該放在優(yōu)化象素著色器程序的復(fù)雜度上。
其他前10個耗時的繪制調(diào)用中還包括對樹葉的繪制。使用和分析地形渲染調(diào)用相同的方法,可以發(fā)現(xiàn)所有樹葉繪制的開銷占總的幀時間的21%(圖9)。圖中顯示渲染樹葉時沒有用戶定義的象素著色器。因此不需要做“SimplePixelShader”實驗。
圖9:選擇使用樹葉著色器的所有繪制調(diào)用
通過“2x2Textures”實驗,可評估減少樹葉的紋理細節(jié)和尺寸,最多提升渲染樹葉性能的41.3%(圖10)。
圖10:樹葉渲染的“2x2Textures”實驗
使用“表單面板”的紋理表單,可以觀察繪制樹葉時使用的紋理(圖11)。我們發(fā)現(xiàn)有一個分辨率為1024x1024的很大的紋理,而且此紋理被訪問了42次。另外,其他幾個樹葉紋理只有顏色的不同,而樹葉結(jié)構(gòu)相同。通過檢查這些繪制調(diào)用使用的著色器程序,發(fā)現(xiàn)這是一個建立樹葉深度緩沖的調(diào)用,目的利用顯卡的Early-Z Rejection功能。而真正的樹葉繪制還在后面第二趟進行。這給我們一個優(yōu)化的提示,由于只需要建立Z緩沖,因此只需要一個表示樹葉結(jié)構(gòu)的紋理即可,紋理顏色在本趟繪制中不是必要的。這樣可以節(jié)省紋理帶寬。
圖11:樹葉渲染使用的紋理
按照圖元數(shù)(Prim Counts)排序,可以查看不同批繪制調(diào)用的尺寸。比較繪制調(diào)用的尺寸和此繪制調(diào)用在屏幕上顯示的大小,可以判斷游戲程序是否進行了良好的LOD(Levels of Detail)優(yōu)化。圖12顯示最大的批繪制包含1540個三角形,但在畫面中顯示很小的部分(渲染目標中粉紅色高亮的部分),通過查看關(guān)聯(lián)紋理等方法,可以判斷這些繪制的對象屬于人物模型,這說明模型網(wǎng)格沒有做LOD優(yōu)化。另外,合適的批繪制尺寸有利于減少繪制調(diào)用的開銷和提高顯卡的處理效率。IIG推薦的批繪制尺寸在200~1000個圖元(primitive)。從排序結(jié)果中可發(fā)現(xiàn)此游戲中接近1/3的繪制調(diào)用的尺寸都小于200個圖元。因此是否可以把部分零碎的小尺寸繪制調(diào)用合并成大尺寸的也是一個可選的優(yōu)化考慮點。
圖12:按照圖元數(shù)(Prim Counts)排序所有繪制調(diào)用
優(yōu)化策略
根據(jù)GPA?發(fā)現(xiàn)的性能問題,我們使用了以下策略進行優(yōu)化。
水面反射:
為了實現(xiàn)逼真的水面動態(tài)光影效果,此游戲每幀都會渲染整個場景在水面反射的倒影,并作為一張紋理貼到河流網(wǎng)格上。渲染水面反射的開銷非常大,幾乎占用了一半的幀時間,有很大優(yōu)化的空間。優(yōu)化的方案如下:
1.?進行阻塞查詢(Occlusion Query),當(dāng)水面不可見時不繪制倒影紋理
2.?在水面可見情況下,僅當(dāng)攝像機的角度和位移大于一定程度才重新繪制倒影紋理。
3.?水中的物體和物體在水面的倒影通常不需要非常清晰,特別是在有波浪的動態(tài)水面上,因此可使用低細節(jié)度的紋理、模型網(wǎng)格以及簡單的著色器程序進行繪制。
4.?在低幀率的平臺上關(guān)閉水面倒影的計算。
樹葉:
游戲中很大一部分時間用于繪制大量的樹葉。幀分析器的實驗顯示,樹葉繪制的瓶頸主要在紋理訪問上。由于這趟繪制只是填充深度緩沖,因此采用的優(yōu)化方案主要是減少使用的紋理,只用一張表示樹葉結(jié)構(gòu)的小紋理。從而降低紋理帶寬。
地形:
在測試場景中,地形在屏幕中占據(jù)的范圍很大。幀分析器的實驗顯示,優(yōu)化重點可放在簡化象素著色器程序的復(fù)雜度上。我們通過簡化紋理混合算法提高性能,并且LOD技術(shù)不僅用在減少遠處對象的mesh細節(jié),而且用在減少著色程序的復(fù)雜度上,甚至很遠處僅使用一張紋理簡單表示。
模型的LOD:
測試發(fā)現(xiàn),一些遠處對象的mesh并沒有使用LOD技術(shù)降低細節(jié)度。雖然測試場景中人物不多,所以這種繪制開銷沒有造成嚴重的性能瓶頸,但這是一個潛在的性能問題。因此金山的開發(fā)者為復(fù)雜模型制作了多種細節(jié)的mesh。使得LOD技術(shù)能在游戲中應(yīng)用。
圖13:優(yōu)化后的測試場景(此圖經(jīng)金山軟件授權(quán)使用)
經(jīng)過上述優(yōu)化,游戲測試場景達到23幀每秒的幀速率(圖13)。如此復(fù)雜的場景在4系列集成顯卡上的性能幾乎提高了1倍。這樣的性能對保證《劍俠情緣三》的可玩性已經(jīng)足夠了,因為對于這款角色扮演游戲而言,服務(wù)器與客戶端同步頻率才每秒16次,因此玩家已能獲得良好的游戲體驗。
總結(jié)
在集成顯卡市場上,英特爾集成顯卡一直占據(jù)最大的份額。隨著移動平臺市場的增長,集成顯卡在所有顯卡市場中的比重越來越大。優(yōu)化游戲在英特爾集成顯卡上的性能,能擴大游戲的潛在銷量。為了使廣大游戲開發(fā)者能掌握英特爾圖形性能分析器的主要功能、分析方法和優(yōu)化技巧,本文介紹了一個在英特爾集成顯卡上優(yōu)化金山公司《劍俠情緣三》網(wǎng)絡(luò)游戲的成功案例。我們使用GPA系統(tǒng)分析器的幾個有用的覆蓋模式分析了游戲渲染管線的負載分布。在使用GPA幀分析器時,我們通過分別按GPU時間和圖元數(shù)排序找到了幾個關(guān)鍵的性能瓶頸,同時我們使用多種實驗評估了最有效的優(yōu)化方向。靈活地使用GPA的豐富功能,大大節(jié)省了我們分析和優(yōu)化游戲的時間。我們希望本文介紹的GPA的功能和分析方法能有助于優(yōu)化您的游戲性能。
參考
[1]?/zh-cn/articles/intel-gpa
[2]?http://jx3.xoyo.com/
[3]?http://www.intel.com/support/graphics/sb/cs-012643.htm
作者簡介
郭勝?英特爾開發(fā)者關(guān)系部門的應(yīng)用工程師,主要負責(zé)為游戲獨立軟件開發(fā)商(ISV)提供英特爾技術(shù)咨詢和性能優(yōu)化服務(wù)。他擁有南京大學(xué)計算機碩士學(xué)位,擅長實時?3D?圖形應(yīng)用的軟件設(shè)計、編程以及性能優(yōu)化。
楊林?現(xiàn)任金山軟件西山居游戲工作室高級開發(fā)經(jīng)理,主要負責(zé)圖形引擎的評估、構(gòu)架和編程等多方面工作。楊林于2003年在浙江大學(xué)能源系畢業(yè),專業(yè)方向為火力發(fā)電。后進入金山軟件公司擔(dān)任主程序的工作,負責(zé)西山居新一代網(wǎng)絡(luò)游戲引擎以及網(wǎng)絡(luò)游戲《劍俠情緣網(wǎng)絡(luò)版三》的開發(fā)工作。
Version :?
Operating System :?
Problem Description :?
Resolution Status :?
[DISCLAIMER: The information on this web site is intended for hardware system manufacturers and software developers. Intel does not warrant the accuracy, completeness or utility of any information on this site. Intel may make changes to the information or the site at any time without notice. Intel makes no commitment to update the information at this site. ALL INFORMATION PROVIDED ON THIS WEBSITE IS PROVIDED "as is" without any express, implied, or statutory warranty of any kind including but not limited to warranties of merchantability, non-infringement of intellectual property, or fitness for any particular purpose. Independent companies manufacture the third-party products that are mentioned on this site. Intel is not responsible for the quality or performance of third-party products and makes no representation or warranty regarding such products. The third-party supplier remains solely responsible for the design, manufacture, sale and functionality of its products. Intel and the Intel logo are trademarks or registered trademarks of Intel Corporation or its subsidiaries in the United States and other countries. *Other names and brands may be claimed as the property of others.] 分類:?
- 圖形?
- ?并行計算?
- ?合作伙伴
總結(jié)
以上是生活随笔為你收集整理的使用英特尔GPA优化《剑侠情缘三》游戏的性能的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python中密码加密存储
- 下一篇: 光速入门Vue