遊戲里的萬人同屏是如何優化?

比如說刺客信條,全面戰爭。就算全是npc,模型只有幾十種,cpu要對這麼多模型做不同的骨骼動畫計算,cpu和gpu帶寬要傳幾百萬Vertex,gpu要clip,插值,計算陰影,貼圖……等等。這裡邊有什麼比較好的優化手段嗎?

而且還有個史詩戰爭模擬器的遊戲甚至可以十萬人同屏

那如果換作全是player呢?有可能出現嗎


首先這幾個例子都沒做陰影,當然這麽多人除非特別的優化,直接做陰影映射估計是沒戲。

你説的幾百萬頂點也是沒有的。

粗略的算一下,主角如果3w多邊形,路人低模100多邊形,中距離的1000個路人需要10w。也就是3個主角站在一起的數據量?

(參考:深海3有數據說一個主角3w多邊形,4代估計能有8w。殺戮地帶4平均人物多邊形數是4w,3代平均1w)

你可以自己搜一下1000個人有多少。你這幾張照片里,看得出人樣子的估計連300都沒有。

遠景如其他答案,特別遠的做billboard完全可行,截圖裏遠景也就是billboard。

至於動畫,也就是讓那些低模小人動起來的方法,可以只計算幾個人物模板動畫,隨機分給大家。

渲染上如果是骨骼動畫,可以通過減少權重數量來減輕計算壓力。或者是下圖是深海4的遠景動畫。他們把動畫數據放到貼圖裏,直接通過uv查找關鍵幀。

最後你看戰爭模擬器裏的士兵其實都是一樣的材質,做GPU Instancing可以一個批次提交大量相同或類似材質的模型,draw call消費也能夠減少。貼圖可以像上圖中使用低解析度貼圖,甚至完全通過調色盤來進行選取。

換做player?渲染問題照著上述優化,沒有區別,網路同步問題另請高明吧。


可以想像這些 NPC 行為需要足夠簡單,像是模擬較複雜的粒子,然後中遠距離用 imposter 渲染。


比如說刺客信條,全面戰爭。就算全是npc,模型只有幾十種,cpu要對這麼多模型做不同的骨骼動畫計算,cpu和gpu帶寬要傳幾百萬Vertex,gpu要clip,插值,計算陰影,貼圖……等等。這裡邊有什麼比較好的優化手段嗎?

這種規模單靠GPU Instancing是絕對吃不消的,一個可行的做法是把距離鏡頭較遠的單位渲染到紋理,然後像畫粒子一樣畫面片

那如果換作全是player呢?有可能出現嗎

沒可能,通信數據量會爆炸,而且就算客戶端不卡,伺服器也會卡成狗


單機遊戲的話,基本上就是把人群當粒子(就像各種飛濺的火星、飄揚的雪花等會大量在同屏內出現但是行為足夠簡單的東西)來繪製,用LOD層關閉遠方「人群」粒子的一些複雜功能。因為中遠距離的人群占這種千人萬人同屏的絕大部分,並且正常情況下玩家的大部分注意力是在近處的,中遠距離的人群行為的簡單僵硬很難被察覺。這種優化效果一般不錯。

如果其他人都是player……迄今為止我是沒見過真正做得到萬人同屏的遊戲,幾千人同屏倒是有一個:EVE Online國服的49-U6U會戰高峰期,同一戰場(大約一億立方公里的空間吧,數量級上應該差不多)上出現了大約3500名玩家。由於這個遊戲的典型交戰距離在數十到數百公里這個尺度,雖然玩家數量極多,但實際上絕大部分玩家駕駛的飛船都離彼此相當遠,遠到了只需要在那個位置畫個圖標而不需要把模型畫出來的程度。

如圖,數千人的戰場在大部分玩家眼裡只有幾十個超級旗艦的低模和一些光束、躍遷攔截泡的特效

這麼多玩家在同一區域聯機,真正考驗的實際上是伺服器。EVE Online為了應對玩家間的大規模會戰,採用了一種稱之為時間膨脹的機制,實際上就是降低交戰星系的時間流速——例如在最高的十倍時間膨脹下,一艘飛行速度300 m/s、每3秒開火一次的飛船,所有面板數據不變,但是以玩家經歷的現實時間作為標準,它一秒只飛30 m,半分鐘才會開一次火。

這樣一來,以上述會戰發生時的時間膨脹率,玩家們持續打了一天左右的會戰實際上只是遊戲中的兩三個小時。理想狀態下,這相當於伺服器只需要處理常規速度下的350人左右的玩家作戰。不過這個機制顯然不能隨便套用到其它遊戲上,比如對各種響應時間要求非常高的FPS遊戲就不行。


全面戰爭用的billboard 每個角色做了16個角度的billoard,所以動畫只是一個面片


各種技巧的本質都是只做幾個十幾個人然後讓他們儘可能的看起來多


LOD 0 骨骼動畫 高模

LOD 1 頂點動畫/geometry cache 低模 gpu instancing

LOD 2 imposter sprite

數量多了以後細節就變得容易被忽略。用一下技巧可以把動畫里的瑕疵敷衍過去。

cpu那邊對於單位狀態的控制也是非常難處理的。

GDC2017應該有一個creative assembly 提及他們美術做法的視頻,搜了一下找不到了。。。

Unity最近新出的job system的也有一個海量單位同屏戰鬥的demo。效果還不錯。


今年剛好實現了千人同屏,支持動畫融合以及AI,1000人40FPS。我主要負責客戶端的,主要使用實例化渲染。伺服器採用幀同步,由公司伺服器端的同事負責研發。主要的性能瓶頸不在GPU,而在CPU。


1.真模型能有幾個……

2.基本上一個屏幕出來20個人就覺得很多了……


騎馬與砍殺開千人戰場才是真的千人同屏,然後就卡成ppt


進入伺服器,客戶端獲取在屏幕里的玩家id和位置,然後每秒獲取多少個玩家的其他信息, 顯示在界面上,如果過多,則把過遠的數據給扔了,不渲染。


骨骼動畫是可以顯卡加速的,如果繪製頻率很高,甚至可以常駐顯存,避免對帶寬造成壓力。

骨骼、網格、貼圖之間可以自由組合,同一個網格換一張貼圖就可以是男女老少,換個骨骼就可以做出各種動作。網格可以粗糙點,一般不會太注意,紋理的採樣是個瓶頸,像素深度可以看情況壓縮壓縮,或者弄成顏色索引。

遠景的優化是關鍵,既要做到速度最大化,又要讓玩家看不出來。比較常規的方法有 LOD,紙片人,紙片人組什麼的。

光照陰影整成後處理,再加上遮擋剔除和前置深度判斷,渲染壓力其實沒有想像中那麼大。


想起了當年的永恆之塔,顛服,6000+玩家的要塞戰。伺服器崩潰


盛大傳奇的攻城戰算不算


作為一個player干過的事兒……

騎砍,真千人,PPT

EVE,在49開個截擊去逛街,卡成PPT(還掉了)


伺服器目前mmorpg 單進程至少要跑到800-2000吧...那麼改成多進程的 有可能能達到萬人?16核cpu 編譯成64位程序 然後把邏輯搞成多線程...理論上是可行的...那麼問題來了 誰弄過多線程的邏輯服...要是單線程多進程的話 那麼得考慮萬人如何分進程的問題 重疊區域和邊緣如何處理...


模型更屎,比如某堵市:天際線

地鐵站里刁民真多


優化?

不存在的

參考某已經涼了的行星邊際2在周六會戰的時候皇冠b點坡下的人口數量以及伺服器的質量


某冷門星戰網遊,百人以上會戰開始以時間膨脹來緩解伺服器的壓力。大型會戰提前申請。。。客戶端拉最遠距離全是小方塊幾乎不用載入模型。


記得以前玩魔獸世界屠城的時候幾個團的人大混戰,都是只敢邊緣ob,混戰中心是不進去的,不是因為不敢打,只是進去了之後ppt都是一種奢求,直接卡成定格動畫……


推薦閱讀:

如何評價OpenGL 4.6?
3D 圖形光柵化的透視校正問題?
有哪些辦法繪製分形?

TAG:遊戲 | 遊戲開發 | 計算機圖形學 | 遊戲優化 | shader |