文/韓大(微信公眾號(hào)handa1740168)

由于現(xiàn)在4g手機(jī)網(wǎng)絡(luò)越來(lái)越普及,絕大多數(shù)用戶的時(shí)延都可以在150ms以內(nèi),所以一些快節(jié)奏的幀同步網(wǎng)絡(luò)游戲開(kāi)始大行其道,現(xiàn)在最火的幀同步游戲無(wú)疑是某農(nóng)藥了。幀同步技術(shù)除了可以用來(lái)做MOBA類游戲,同樣可以用來(lái)做需要大量快速操作的格斗類游戲,本文就是嘗試提出一些解決幀同步方案下格斗游戲的優(yōu)化措施。

(本文中涉及一些使用Unity引擎的術(shù)語(yǔ),但大多數(shù)其他游戲引擎也有類似的概念,所以并不僅僅是針對(duì)使用Unity的游戲)

概念

我們一般認(rèn)為,LockStep游戲由于網(wǎng)絡(luò)延遲,畫(huà)面的反應(yīng)會(huì)比直接本地渲染要慢很多,所以我們希望畫(huà)面能對(duì)玩家的輸入有即刻的反應(yīng)。但也希望對(duì)其他用戶的交互是一致的。

095216hqszkkoug6s8gv4s.jpg
所以有一些游戲采用所謂“預(yù)渲染”策略:

一、邏輯與渲染分別驅(qū)動(dòng):所謂渲染模塊,就是用來(lái)給本地客戶端表現(xiàn)的畫(huà)面,使用本地渲染驅(qū)動(dòng),也就是Unity的Update()事件;所謂邏輯模塊,就用來(lái)運(yùn)行所有的攻擊判定(角色位置、攻擊與受擊區(qū)域)的變化,使用服務(wù)器發(fā)來(lái)的網(wǎng)絡(luò)包進(jìn)行驅(qū)動(dòng),也就是通過(guò)同步服務(wù)器得到包后再運(yùn)行。

二、糾正渲染誤差:由于本地客戶端驅(qū)動(dòng)導(dǎo)致的表現(xiàn),可能和網(wǎng)絡(luò)包驅(qū)動(dòng)的情況不一致,所以需要某些機(jī)制予以糾正,使兩者的差異不要太大。一般采用的策略有兩個(gè):一是定時(shí)同步。預(yù)渲染的角色,每隔200ms(可以設(shè)置成其他值),就停止運(yùn)行,等待邏輯角色的狀態(tài)和自己同步?!@種策略適合那種走走停停的角色行為;二是對(duì)于某些輸入,比如釋放攻擊技能,或者受到攻擊,邏輯角色啟動(dòng)對(duì)預(yù)渲染角色的糾正。糾正內(nèi)容包括位置的拉扯(可以是瞬時(shí)或者平滑過(guò)程)和播放對(duì)應(yīng)的動(dòng)畫(huà)(如播放受擊動(dòng)畫(huà))

動(dòng)畫(huà)分線

·以Sprite組合的Animation為“渲染角色”
·以Collider組合的Animation為“邏輯角色”
·“渲染角色”動(dòng)畫(huà)由Update()事件驅(qū)動(dòng),同時(shí)負(fù)責(zé)向同步服務(wù)器發(fā)出操作
·“邏輯角色”動(dòng)畫(huà)由同步服務(wù)器收包得到的數(shù)據(jù)驅(qū)動(dòng)

·Update()事件每秒60個(gè)調(diào)用,而從同步服務(wù)器收包操作,一般每秒15-30個(gè)調(diào)用,所以,每次“邏輯角色”動(dòng)畫(huà)或位置更新,都要以x4 – x2的倍速來(lái)運(yùn)行

095217jvj1aww9wgagwp21.jpg
如上圖所示,“邏輯角色”和“顯示角色”在很多時(shí)候,并不重合,可能存在位置不一致、播放的動(dòng)畫(huà)狀態(tài)不一致的情況。上圖就是在玩家按下“向右移動(dòng)”按鈕后的15ms時(shí)出現(xiàn)的情況。這就需要在一些時(shí)機(jī),以“邏輯角色”為準(zhǔn),來(lái)修正“顯示角色”的狀態(tài)。

渲染糾正

·移動(dòng)行為糾正:

§每隔固定的時(shí)間(推薦200ms),停止渲染角色的移動(dòng)以及發(fā)送移動(dòng)指令到網(wǎng)絡(luò)。等待邏輯角色的位置和渲染角色的位置重疊。

§如果等待時(shí)間超過(guò)固定間隔(推薦1000ms)還沒(méi)有能讓兩角色位置一致,則直接將渲染角色拉扯到邏輯角色位置上,使之一致。

·戰(zhàn)斗行為糾正:

§每次釋放技能(本地渲染),如果渲染角色和邏輯角色直接的位置差異大于固定值(推薦100像素),則立刻拉扯渲染角色到邏輯角色位置。

095217g00k0o57aorcod5r.jpg
§每次釋放技能(本地渲染)結(jié)束后,等待固定間隔(推薦100ms)后,才接受新的輸入指令。

095218tg6o6arv5tc6ic5e.jpg
§每次技能命中(邏輯渲染)后,立刻對(duì)受擊方進(jìn)行位置拉扯,使渲染角色和邏輯位置一致。

095219gj6m5s6nitemdnrs.jpg
總結(jié)

使用預(yù)渲染技術(shù)的最重要策略,還是堅(jiān)持幀同步的原則:相同的輸入,得到相同的輸出。而預(yù)渲染的方案,是把那些嚴(yán)格同步的游戲邏輯、與其表現(xiàn)區(qū)分開(kāi)來(lái),這樣可以專門的去讓畫(huà)面看起來(lái)更流暢,同時(shí)不影響幀同步游戲的“一致性”。由于存在一個(gè)“看不見(jiàn)”但正確的邏輯模型,所以只要想辦法盡量“好看”的把表現(xiàn)糾正到正確的位置或狀態(tài)即可。這種糾正可以利用游戲中的各種“不可操作”時(shí)機(jī),或者其他游戲特色中可以利用的條件,來(lái)讓糾正盡量不影響游戲體驗(yàn)。

銳亞教育

銳亞教育,游戲開(kāi)發(fā)論壇|游戲制作人|游戲策劃|游戲開(kāi)發(fā)|獨(dú)立游戲|游戲產(chǎn)業(yè)|游戲研發(fā)|游戲運(yùn)營(yíng)| unity|unity3d|unity3d官網(wǎng)|unity3d 教程|金融帝國(guó)3|8k8k8k|mcafee8.5i|游戲蠻牛|蠻牛 unity|蠻牛