《球球大作戰(zhàn)》50人同屏的客戶端卡頓解決技巧,球球大作戰(zhàn)卡頓怎么辦?球球大作戰(zhàn)一直最為一款集社交與休閑的游戲,非常受玩家的喜愛,一個房間通?梢匀菁{很多人,但是當(dāng)人數(shù)超多50人時會出現(xiàn)客戶端卡頓的情況,這是怎么回事?又改怎么解決呢?西西為大家?guī)硐嘣敿毜恼f明。
球球大作戰(zhàn)卡頓原因及解決方法:
卡頓一:光環(huán)、圣衣組建卡頓的處理
卡頓的話,大概就這么些,《球球》主要卡頓點就在于,因為服務(wù)器是十次每秒刷新,因為是十次,不像客戶端幀數(shù)比較高,所以你發(fā)一次的話,這個數(shù)據(jù)量里面球的數(shù)量其實非常大的,就引起了一個問題。問題是發(fā)過來這一刻,要處理大量的數(shù)據(jù),會造成卡頓。還有就是美術(shù)方面的問題,因為我們球上面掛了很多組件,這些組件尤其光環(huán)和圣衣這個東西越做越炫,會引起卡頓,而且我們一局游戲,有50多個人,而且中途還會再加入新的玩家,如果提前進這局游戲之前把所有東西都加載到,這個內(nèi)存是肯定承受不了的。而且我們加載是沒有立即進入游戲,這就造成一個問題,我們必須要在玩的過程中來加載美術(shù)資源,這樣也會引起卡頓。
遇到一個卡頓的話,我們得找這個卡頓在哪里?然后找到的話,我們得分析是由于什么東西造成的!肚蚯颉愤@塊,剛才也整個介紹了一下,主要就是這兩個地方。先看一下球體組件的加載,球體組件的話,我們光環(huán)跟圣衣現(xiàn)在已經(jīng)有幾百多個了,有三百多個,最壞的情況下,可能每個玩家用的光環(huán)跟圣衣都不一樣,這樣在一局游戲里面都顯示出來的話,對游戲的內(nèi)存,及其渲染,其實壓力非常之大。這個只是一部分,主要是光環(huán),F(xiàn)在玩家審美要求越來越高,我們做的東西也越來越炫,這樣造成非常多的卡頓,接下來給大家介紹一下我們是怎么優(yōu)化這塊。美術(shù)這塊優(yōu)化,這次沒怎么講,因為網(wǎng)上美術(shù)這塊怎么優(yōu)化有很多,我主要講是怎么加載的。
我們先看一下組件的構(gòu)成,一個球本體是一個球,這個球其實是一個2D的一個慢視平面的,然后名字,名字這塊我們是用自己做的一個,等于是自己寫,自己寫的好處就是效力比較高,可以走Unity自己的那個合P(音)流程,然后那個國旗也是一個慢視,不是用UI做的。還有光環(huán)、拖尾圣衣,還有箭頭,這些加載壓力都非常大的。我們是怎么優(yōu)化這塊,優(yōu)化主要用到分幀處理。
分幀處理大家應(yīng)該多少都了解到就是把一堆大量的計算全部拆開來,分散到到各個幀里面,這樣的話幀數(shù)就很平穩(wěn),不會出現(xiàn)一個大的CPU曲線的波峰。每個球依次進行加載,一個球加載完了,再加載另一個球,這樣的好處,有可能球2還沒有加載完,就已經(jīng)被吃掉了,這樣有一個好處,我們就減少了大量的計算,大量的加載。而且玩家看的話也是比較流暢,不會出現(xiàn)突然畫面不動,然后又開始動了的那種情況。
卡頓二:大視野大量球的刷新卡頓
然后優(yōu)化后,我們發(fā)現(xiàn)幀數(shù)是上來了,但是還是有很大的波動,這塊主要原因就是大視野大量球的刷新卡頓。因為我們的游戲視野是不固定的,不像其他游戲視野一直固定的,在同一屏里面看的東西基本不會高的太多,我們游戲就不同了。有可能一個屏幕里面,可能看到成百上千個元素還有物體。而且玩家在玩的過程中,如果玩得好的話,視野是來回變動的,服務(wù)器發(fā)數(shù)據(jù)的話,因為只發(fā)我們看到的數(shù)據(jù),所以我們玩家在來回切換的情況下,服務(wù)器發(fā)的數(shù)據(jù)也是很多的,就是大量的球跟添加刪除,這樣的一個操作對客戶端的壓力也非常大,所以客戶端的話,就需要做一些計算,一些處理,這里就很考驗一個場景管理的框架。
策略:雙緩沖列表和分幀添加與刪除
然后這塊我們主要是有兩個策略,就是雙緩沖列表還有分幀添加和刪除。分幀這塊在組件加載那塊已經(jīng)講過了,邏輯差不多。雙緩沖列表簡單來說,就是兩種列表。第一個就是添加列表,第二個就是刪除列表,有了這個列表,在實際加載球的過程中,我們可以有列表作為緩沖。這個好處就是有了緩沖,如果有重復(fù)的球,我們就不需要重復(fù)地進行加載,所以在這個列表里面進行合并或者去除。
比如說當(dāng)一個新加載球要過來的時候,我們?nèi)绻袛噙@個,或者判斷這個場景里面有這個球,或者這個列表里面有這個球,我們就可以不用處理。如果一個刪除的球進來的話,我們判斷這個刪除列表里面已經(jīng)有了這個球,我們也可以不用處理。或者就算沒有,可以看到如果添加列表里面有,我們可以把添加列表里面要刪除的球去掉,這樣我們就能省掉很大量的工作。這塊的話,又引出了一個問題,因為列表是用List(音),如果要找這個列表很長,可能有幾百個元素,用List的話,因為要一個個辨別,效率非常低,我們就把List和字典做了一個結(jié)合,既查找得快,也能刪除得快。
分幀添加刪除這塊,跟組件加載不一樣的地方每一幀加載或者刪除的元素是動態(tài)變,可以根據(jù)手機幀率,如果手機幀率特別高,可以每幀處理的元素就很多,如果幀率低了,我們就可以動態(tài)地減少,這樣可以控制手機幀率來回波動的情況。
看一下優(yōu)化的效果,大概是這樣的效果,優(yōu)化后整個波動就比較平緩,大家可以看到,上面有一些小波峰,就是一些處理的結(jié)果,但是很難出現(xiàn)那種大的波動,這是一個理想的情況。其實玩的過程中,還是會出現(xiàn)波動情況。因為美術(shù)資源那塊有一個東西如果非常大的話,也會造成一定的影響。這塊美術(shù)資源后期我們會做一個低端機型的美術(shù)資源包來替換,這樣可以保證在低端機上能流暢玩下去。
球球大作戰(zhàn)游戲性的體現(xiàn):
一,《球球》這個游戲主要是球跟球之間的關(guān)系,它們的關(guān)系規(guī)則簡單,可以用公式來概括。用的最多就是一些物理的公式,這些比較簡單,我們就很容易做出來。
二,快速游戲,這個游戲中途可以隨意加入退出,而且我們的進入游戲是沒有載入時間,直接點擊按紐,就直接進去了。
三,實時觀戰(zhàn),玩家可以觀戰(zhàn)其他玩家,在這種情況下,客戶端是沒有任何操作的,全靠服務(wù)器把數(shù)據(jù)發(fā)過來。但是這種特性,我們也做了一些選擇,最終的方案是狀態(tài)同步的一個機制模式。這個模式有一些好處,就是開發(fā)效率比較高,這個開發(fā)效率是相對而言,可能對別的游戲狀態(tài)同步可能比較麻煩,但是對我們游戲這種機制,其實開發(fā)效率非常高的。然后客戶端的計算量大大降低,方便性能優(yōu)化,就是客戶端的一些球跟球之間的邏輯,因為用公式來概括的,而且球跟球之間的計算,因為球很多,所以計算量非常大,這塊客戶端是不需要計算的,直接通過服務(wù)器計算,然后把結(jié)果發(fā)過來。因為是在服務(wù)器上算,這塊反外掛過來也比較簡單。
四,斷線重連,因為計算都在服務(wù)器,所有信息都在服務(wù)器,一旦斷線,就可以立馬連上去,恢復(fù)當(dāng)前的狀態(tài)。傳輸協(xié)議,我們現(xiàn)在用的是TCP,TCP這塊,其實我們現(xiàn)在用的是,大部分情況下還好,主要在延遲情況下,TCP比UDP要更差一點,之后的話會逐步替代成UDP,或者是TCP和UDP共存的情況。