五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

研發(fā)日志技術(shù)篇(上)——如何死磕GPU

2022-12-09 18:19 作者:異星前哨  | 我要投稿

各位船長(zhǎng)好,今天我們有備而來(lái),給大家展示一個(gè)“核爆級(jí)”秘密武器——同屏十萬(wàn)只怪!給各位觀(guān)眾姥爺開(kāi)開(kāi)眼。如果非專(zhuān)業(yè)人士看后有“不明覺(jué)厲”的感覺(jué),那就對(duì)了?。ㄊ謩?dòng)狗頭)

立項(xiàng)之初,為了使《異星前哨》在市場(chǎng)上更有競(jìng)爭(zhēng)力,制作人設(shè)定了這個(gè)看起來(lái)比較瘋狂的目標(biāo)。

十萬(wàn)只怪!技術(shù)組開(kāi)了一禮拜的會(huì),要達(dá)成這個(gè)目標(biāo),我們得面臨CPU+GPU(圖形處理器,顯卡的核心)的雙重壓力。因?yàn)楹A课矬w的繪制,需要GPU承擔(dān)。這些物體的尋路、戰(zhàn)斗、AI等行為又需要CPU的計(jì)算,這幾乎是一個(gè)極限挑戰(zhàn),那么…

咳咳,盡管在公司的另一個(gè)項(xiàng)目《鐵甲雄兵》已經(jīng)實(shí)現(xiàn)了同屏數(shù)百人戰(zhàn)斗的大戰(zhàn)場(chǎng),但同屏十萬(wàn)的難度跨越著實(shí)有點(diǎn)大,經(jīng)過(guò)了對(duì)各類(lèi)性能問(wèn)題漫長(zhǎng)的死磕,初步總結(jié)了一些方法,本篇主要從GPU角度的兩個(gè)主要方案來(lái)談一下。

?

一、GPU大批量動(dòng)畫(huà)優(yōu)化渲染技術(shù)

由于游戲中存在海量怪物,每只怪物都需要播放各種動(dòng)畫(huà),勢(shì)必會(huì)對(duì)運(yùn)行效率產(chǎn)生嚴(yán)重影響,所以需要一種新的動(dòng)畫(huà)渲染技術(shù),能夠承受海量的物體。

現(xiàn)代顯卡的性能增長(zhǎng)非??欤款i逐步變成GPU和CPU之間的數(shù)據(jù)同步,每一次同步都需要互相等待,雙方浪費(fèi)大量時(shí)間。之前的很多游戲包括手游,都把減少drawcall作為一個(gè)重要優(yōu)化手段,因?yàn)槊恳淮蝑rawcall都會(huì)導(dǎo)致一次CPU上傳數(shù)據(jù)+GPU繪制的同步。這里要注意的是,并不是說(shuō)drawcall本身效率很低,而是常規(guī)drawcall導(dǎo)致的數(shù)據(jù)同步效率極低,當(dāng)然drawcall本身也是有開(kāi)銷(xiāo)的,能減少是最好。

因此這次的優(yōu)化方向是,減少CPU與GPU的數(shù)據(jù)同步。怪物盡可能由GPU繪制,最大可能減少數(shù)據(jù)同步,以達(dá)到最高異步效率。知易行難,定了方向但是還有很多技術(shù)細(xì)節(jié)需要克服。

?

傳統(tǒng)骨骼動(dòng)畫(huà)計(jì)算(CPU計(jì)算骨架+GPU計(jì)算蒙皮)

傳統(tǒng)的做法是CPU按照動(dòng)畫(huà)序列計(jì)算當(dāng)前各骨架位置(BoneMap),然后把BoneMap傳遞給GPU,GPU通過(guò)VertexShader,結(jié)合各mesh頂點(diǎn)數(shù)據(jù),對(duì)應(yīng)BoneMap數(shù)據(jù)以及骨骼權(quán)重等進(jìn)行插值計(jì)算,得到新頂點(diǎn)位置。傳統(tǒng)動(dòng)畫(huà)處理由于需要CPU+GPU兩個(gè)步驟順序進(jìn)行計(jì)算,每個(gè)動(dòng)畫(huà)物體需要每次單獨(dú)調(diào)用繪制,同時(shí)獨(dú)立物體動(dòng)畫(huà)計(jì)算時(shí)需要在Drawcall時(shí)傳遞不同材質(zhì)參數(shù),不利于合批高效繪制,另外CPU與GPU之間頻繁進(jìn)行數(shù)據(jù)交互也會(huì)產(chǎn)生很大開(kāi)銷(xiāo),所以我們必須換一種方式。

貼圖骨骼動(dòng)畫(huà)

為了將計(jì)算挪入GPU,必須把相關(guān)數(shù)據(jù)存入顯存供GPU讀取,首先是美術(shù)輸出的骨骼動(dòng)畫(huà)信息,我們選擇將各骨骼運(yùn)動(dòng)的動(dòng)畫(huà)幀變化存到貼圖RGBA Float格式中作為貼圖骨骼動(dòng)畫(huà)文件,在VertexShader中通過(guò)函數(shù)tex2dlod采點(diǎn)獲取貼圖顏色數(shù)值,通過(guò)將顏色數(shù)值轉(zhuǎn)換為變換矩陣,從而與本地mesh頂點(diǎn)等信息,產(chǎn)生動(dòng)畫(huà)變換。(注:在材質(zhì)設(shè)置貼圖采樣模式時(shí)選用point,避免貼圖采樣受其他模式干擾)

其次,游戲運(yùn)行時(shí),每只怪物都有自己的當(dāng)前動(dòng)畫(huà)信息,這些信息也需要同步給GPU,考慮后續(xù)的批量繪制等優(yōu)化技術(shù),我們還是選擇貼圖做為載體。先將各動(dòng)畫(huà)集如idle,run,attack轉(zhuǎn)換為貼圖動(dòng)畫(huà)紋理,在將這些貼圖動(dòng)畫(huà)作為一個(gè)材質(zhì)的各貼圖通道。

另外由于批量繪制中各個(gè)角色播放的動(dòng)畫(huà)第幾幀以及播放哪個(gè)動(dòng)畫(huà)集不確定,所以在調(diào)用draw call前,通過(guò)CPU計(jì)算各個(gè)單位動(dòng)畫(huà)系統(tǒng)得到一張全單位mask圖,圖上每個(gè)像素代表一個(gè)單位,一個(gè)像素RGBA信息記錄,該單位播放哪個(gè)動(dòng)畫(huà)集以及播放第幾幀。這樣,一張貼圖就包含了所有單位的實(shí)時(shí)狀態(tài)信息,可以直接傳輸給GPU,只有一次數(shù)據(jù)同步。

總之,就是想辦法把骨骼計(jì)算壓力轉(zhuǎn)給GPU,把CPU閑出來(lái)。

大批量實(shí)例化繪制

普通drawcall繪制函數(shù)一次只能繪制當(dāng)前的一個(gè)mesh,而繪圖系統(tǒng)還提供了批量繪制的接口,可以繪制一個(gè)mesh多次,出現(xiàn)在不同位置坐標(biāo)。函數(shù)類(lèi)型形如:

void DrawMeshInstanced(Mesh mesh, int submeshIndex, Material material, List<Matrix4x4> matrices);

這個(gè)函數(shù)一般只能拿來(lái)加速靜態(tài)物體,比如場(chǎng)景里的石頭之類(lèi)。因?yàn)閯?dòng)態(tài)物體有動(dòng)畫(huà),幾個(gè)動(dòng)態(tài)物體很難完全一致。

我們發(fā)現(xiàn)由于游戲里怪物數(shù)量非常多,總有一些怪物的動(dòng)畫(huà)幀當(dāng)前相同,正好使用這個(gè)函數(shù)進(jìn)行加速。舉個(gè)例子,最常見(jiàn)的怪物進(jìn)攻,假設(shè)移動(dòng)動(dòng)畫(huà)長(zhǎng)2秒,當(dāng)前運(yùn)行速度每秒60幀,無(wú)論多少只怪物,理論上最多調(diào)用60x2=120次就可以畫(huà)完全部怪物。因?yàn)楣治镒疃嘀挥?20種狀態(tài)。當(dāng)然實(shí)際情況更復(fù)雜,因?yàn)槊颗_(tái)機(jī)器幀率都不一樣。

?

動(dòng)畫(huà)物體大批量實(shí)例化繪制

要使用動(dòng)畫(huà)物體大批量實(shí)例化繪制接口,首先要使多單位物體材質(zhì)合批繪制,另外為了提高骨骼動(dòng)畫(huà)效率采用貼圖動(dòng)畫(huà)技術(shù),因此最終方法為:


二、大批量物體陰影優(yōu)化渲染技術(shù)

?

陰影在游戲效果中能體現(xiàn)物體的更真實(shí)表現(xiàn),在實(shí)際游戲中由于單位眾多,每個(gè)單位所需陰影效果也是需要一種優(yōu)化渲染技術(shù)。?

?

傳統(tǒng)陰影功能

在傳統(tǒng)繪制陰影功能中,需要將產(chǎn)生陰影的物體額外繪制一遍ShadowMapDepth,最后將所生成的ShadowMap與畫(huà)面中的接收陰影物體比較深度從而確定是否繪制陰影著色。

在多單位的情況下這里的額外繪制ShadowMapDepth處理成為影響效率的瓶頸,如何降低這個(gè)Pass繪制次數(shù)成為了關(guān)鍵問(wèn)題所在。

?

批量化GPU陰影技術(shù)

首先按照屏幕大小創(chuàng)建一個(gè)RT,控制渲染次序在場(chǎng)景不透明物體渲染之后,獲取當(dāng)前場(chǎng)景繪制完的深度圖,調(diào)用實(shí)例化繪制接口繪制多單位陰影,將深度圖等信息傳入所需大批量單位繪制ShadowCasterPass,從而在RT中獲得當(dāng)前屏幕內(nèi)多單位最終陰影效果貼圖,將該RT貼圖與屏幕當(dāng)前像素合并從而實(shí)現(xiàn)陰影最終效果。

進(jìn)一步改進(jìn),通過(guò)在繪制單位中預(yù)留代理陰影體,在VertexShader階段中做動(dòng)態(tài)切換本體頂點(diǎn)或代理陰影體頂點(diǎn),切換最終哪些頂點(diǎn)光柵化在pixel shader著色計(jì)算陰影提高效率。(調(diào)Shader可真是個(gè)體力活)

本篇結(jié)尾

這期《異星前哨》技術(shù)部關(guān)于GPU的吐槽就到這里了,后面我們會(huì)分享CPU相關(guān)的優(yōu)化經(jīng)驗(yàn),還請(qǐng)大家多多加入心愿單,以及游戲?qū)⒃?2月16日正式發(fā)售,歡迎大家捧場(chǎng)!


研發(fā)日志技術(shù)篇(上)——如何死磕GPU的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
商水县| 淮安市| 曲阜市| 旌德县| 水富县| 霸州市| 南陵县| 桃源县| 永平县| 台山市| 佳木斯市| 滕州市| 合川市| 建宁县| 霸州市| 泰宁县| 宁远县| 南澳县| 惠东县| 宁波市| 曲阜市| 从化市| 马尔康县| 邹平县| 舒城县| 都昌县| 靖宇县| 延寿县| 阆中市| 甘南县| 高雄县| 禹州市| 东海县| 鹤岗市| 杭锦后旗| 宝清县| 通渭县| 锡林浩特市| 阿瓦提县| 蓝田县| 兰坪|