999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

網絡游戲中移動同步問題的解決方案

2007-01-01 00:00:00梁白鷗陳雷霆
計算機應用研究 2007年5期

摘要:在基于C/S網絡游戲架構下,介紹了網絡游戲中的網絡分布式對象的概念,分析了基于圖形幀移動的錯誤方法,提出了一種基于時間移動的算法,并使用插值的方法改進了該算法。最后在上述基礎上,提出了一種基于客戶端預測和客戶端修正的移動同步算法。在實時性要求較高的網絡游戲中該算法完全能解決移動同步問題。

關鍵詞:網絡引擎;網絡游戲;同步;客戶端預測;分布式對象

中圖分類號:TP391.9文獻標志碼:A

文章編號:1001-3695(2007)05-0207-03

0引言

目前網絡多人在線游戲主要有以下兩種典型的網絡拓撲方式:一是C/S模式,即所有的網絡數據都必須從一個客戶端到一個服務器,然后又由服務器中心轉發到其他客戶端上;二是Peer-to-Peer模式,Peer-to-Peer游戲沒有專門的服務器。在Peer-to-Peer世界中,每個客戶端都要與其他客戶端進行網絡通信[1]。

在基于C/S架構的網絡多人在線游戲中,服務器通常扮演著重要的角色,它主宰著整個游戲世界,負責游戲規則的判定,并處理客戶端傳來的玩家輸入??蛻舳撕头掌饕詷O高的速率發送數據量很小的數據包進行通信??蛻舳私邮债斍霸诜掌魃险麄€游戲世界的狀態,并通過該狀態產生視/音頻效果并展示給玩家,客戶端也通過對輸入設備(鍵盤、鼠標、游戲桿等)進行定時采樣將采樣信息發送給服務器作進一步的處理[2]。

與單機游戲相比,網絡游戲需要處理許多新的問題,如帶寬、網絡延遲、網絡丟包問題等。這些問題均會導致網絡同步,特別是在實時性很高的第一人稱射擊游戲中,網絡同步問題成了制約游戲性能好壞的關鍵因素。

1網絡同步中的關鍵技術

1.1網絡分布式對象

網絡分布式對象在游戲網絡引擎中非常重要,是多人網絡游戲中必不可少的技術。該技術的大體思路是:如果一個對象一旦在一個客戶端上被創建,則該對象也會在所有已經連接到服務器的客戶端上被創建;如果一個對象在客戶端上被銷毀,則它就會在所有已連接到服務器上的客戶端中被銷毀[3]。

為便于描述,筆者將在本地客戶端上的對象定義為Player對象,非本地客戶端上的相應對象定義為GhostPlayer對象;兩個對象具有相同的操作,但可能具有不一致的數據。圖1描述了兩個客戶端加入服務器后Player和GhostPlayer對象在網絡中的分布情況。

當創建好分布式對象后,就可以通過分布式對象上相應的網絡接口(如RPC)進行對象到對象的通信,給編程人員的感覺如圖1中的虛線路徑:PlayerA(客戶端A)到GhostPlayerA(客戶端B);但實質上還是經過了以下的通信過程:PlayerA(客戶端A) 到GhostPlayerA(服務器)到GhostPlayerA(客戶端B)。

1.2基于時間的移動

游戲時間的安排非常重要[4]。一些編程者通常會把特定的硬件時間放置到游戲循環中,即他們可能根據幀計數器更新游戲,而不是根據所經歷的實際時間來更新游戲。特別是在網絡游戲中,保持基于時間的更新是保證各個客戶端同步的基礎。典型的錯誤方法如下:

float t = 0.0f, TimeStep=0.01;

while (!quit)

{ProcessInput(t);…Player.position.x=Player.position.x+5;…

MoveObject(t);

Render(state);

t += TimeStep;

}

在上述代碼中,每次游戲的更新都會使玩家在x方向上移動五個單位。假設有一個CPU為1 GHz的計算機,由游戲循環的處理將消耗計算機1/60 s的時間可知, 1 s內游戲將更新60次,這將會使玩家移動300個/s單位;如果一個計算機的CPU頻率為2 GHz,那么游戲將以幀率為120 fps的速度運行,即兩倍于前者計算機的幀速運行這個游戲,這將使玩家移動600個/s單位。如果他們是網絡上的對手,那么后者將能以兩倍于前者的速度在游戲世界中移動。

上述方法顯然是錯誤的,因此需要一種基于時間移動的算法。目前的解決辦法是:使用一個時間累計器(Accumulator),在每次更新時將每次游戲更新的時間間隔(DeltaTime)加到累計器上;當累計的時間大于TimeStep時就開始一次物理模擬,并將累計的時間減去TimeStep。該算法能保證游戲完全以TimeStep的時間步長進行游戲更新。下面是該算法的核心代碼:

float TimeStep=0.01;//表示每0.01 s更新一次

while(!quit)

{float CurrentTime=time();//獲得當前的時間

float DeltaTime=CurrentTime–PreviousTime;

//獲得上一次更新的時間

PreviousTime=CurrentTime;

Accumulator+=DeltaTime;

while (Accumulator>=TimeStep)

{ProcessInput(t);//處理鍵盤及鼠標輸入

SimulationGhostPlayers(t);//模擬GhostPlayer的物理運動

ConnectionUpdate(t);//網絡數據的更新

Accumulator -=TimeStep;

t++;

//時間遞增,這里簡化成UINT類型的數據,加快運行速度

}

float alpha=Accumulator/TimeStep;

RenderLocalPlayer(alpha);//渲染本地Player

RenderGhostPlayers(alpha); //渲染已經連入服務器的GhostPlayer

}

在上面的算法中出現了一個Alpha變量,該變量有什么作用呢?如果幀率為55 fps,物理模擬以60 fps運行,那么物理更新有可能在兩次顯示更新內完成或者在一次顯示更新內完成(當Accumulator累計到一定程度時)。這種不規則的物理更新頻率將會在屏幕上呈現出一種感覺不真實的物理模擬。Alpha變量能保證物體平滑移動。實質上是在上一次物理狀態和當前物理狀態之間進行線性插值。

State state=CurrentState×alpha+PreviousState×(1-alpha)(1)

其中,alpha=Accumulator/TimeStep,alpha∈[0,1]。用Alpha來做兩個狀態之間的線性插值得到當前的狀態,然后對計算出的當前狀態進行渲染。如果要取得更好的效果,則需采用Slerp方法進行插值。

1.3網絡對象移動的同步算法

要優雅并且高效地做到使每個客戶端遠程控制自己的角色,并且盡可能真實地反映服務器上的物理狀態,就需要將物理模擬做如下的結構化[5](假設只需要處理對象的前后左右移動):

struct Inputstruct Statestruct Move

{bool left; {Vector position;{Input input;//輸入

bool right;Vector velocity;State state;//狀態

bool forward; };UINT time;//時間

bool back;}

};

上述結構化保證了:角色的物理狀態(State)完全由輸入數據驅動;物理狀態能被完全地封裝在一個state結構中;并由Time來同步服務器和客戶端的時間。物理模擬由初始的狀態和輸入決定。

現在假設客戶端的時間已經與服務器端的時間同步,且只考慮在一個TimeStep周期內的過程。那么網絡對象移動同步算法的大體描述如圖2所示。

上。該信息主要用于使PlayerA與GhostPlayerA同步。

(6)客戶端A根據服務器發送過來的信息對PlayerA的狀態進行修正。

(7)客戶端B根據服務器發送過來的Inputserver來模擬GhostPlayerA的運動,如果模擬后的運動與Stateserver的誤差大于一個閾值δ,則平滑地運動到Stateserver。

1.4客戶端預測與客戶端修正

目前為止,已經提出了一個方法,通過客戶端的輸入來驅動服務器上的物理狀態,然后廣播該物理狀態到每個客戶端。因此每個客戶端可以維持一個與服務器近似的物理狀態。其中最重要的兩種技術為客戶端預測和客戶端修正[6]。實現同步通常有兩種解決方案:

(1)驗證同步,即每條指令在服務器驗證通過后再執行動作。比如,客戶端A按下前進鍵,直到該信息發送給服務器并從服務器返回后才做真正前進的運動。該方法的優點是能保證各個客戶端之間絕對的同步;其缺點是,在網絡延遲較大時,玩家客戶端的行為變得很不流暢。顯然這不適合實時性要求較高的游戲。

(2)采用客戶端預測的方法。該方法通過使用客戶端的輸入來預測服務器上的物理狀態,而不等待服務器的狀態返回。服務器周期性地發送修正數據到客戶端,客戶端通過該數據不斷修正自己,從而保證與服務器的物理狀態同步。比如,客戶端A按下前進鍵,不等待服務器的返回信息,而直接做前進運動;通過服務器返回的狀態來不斷修正客戶端的預測狀態。 該方法能保證客戶端圖形的流暢性。

客戶端預測最復雜的部分就是處理來自服務器的同步修正。這個技術的具體實現需要使用一個存放客戶端的QueueMoves隊列。該隊列存儲客戶端的上n次移動操作。當客戶端收到一個來自服務器t時刻的修正,它遍歷所有存放QueueMoves的隊列,找到客戶端t時刻的Move,并將服務器發送來的物理狀態與其當前的物理狀態進行比較。如果兩個物理狀態的差大于閾值Threshold,那么客戶端將返回到t時刻,根據服務器的狀態重新模擬t時刻后的所有過程。以下是該算法的核心代碼:

Move moves[1024]; //假設隊列的最大容量為1024

int head=0, tail=100;//假設已經有50個Move存放到隊列中

void ClientCorrection(UINT ServerTime, State ServerState, Input ServerInput)

{while (time>moves[head].time head!=tail)

erase (head); // 移出過時的Move操作

//隊列不為空,且與服務器上操作的時間相同

if (head!=tail time==Moves[head].time) 

{if ((moves[head].state.position-CurrentState.position).length>threshold)

{ CurrentTime=ServerTime;//保存服務器的時間

CurrentState=ServerState;//保存服務器的物理狀態

CurrentInput=ServerInput;//保存服務器的輸入

erase(head);// 移出隊列首Move

int index=head;

while (index!=tail)// 重新模擬t時刻之后的所有過程

{const float deltaTime=moves[index].time-currentTime;

updatePhysics(CurrentTime, deltaTime, CurrentInput);

CurrentTime=moves[index].time;

CurrentInput=moves[index].input;

moves[index].state=CurrentState;

index++;

}

} 

}

}

2實驗及結果

按照上述算法,以Visual C++.NET為開發工具,圖形部分采用OpenGL,網絡部分采用TNL(www.opentl.org)網絡引擎,實現了第一人稱射擊游戲的演示版。在多臺計算機上分別運行服務器和多個客戶端,運行效果較好,基本上能滿足第一人稱射擊游戲的網絡同步。

3結束語

同步問題在網絡游戲中是十分重要的問題,急需解決。目前的措施都是采用一些同步算法來減少網絡不同步帶來的影響。這些同步算法都是從分布式軍事仿真系統中借鑒過來的。在C/S架構下,網絡游戲中大多采用分布式對象進行通信,采用基于時間的移動,移動過程中采用客戶端預測和客戶端修正的方法保持客戶端與服務器、客戶端與客戶端之間的同步。本文中提出的移動同步算法在實時性要求較高的網絡游戲中有較好的效果。

參考文獻:

[1]CRONIN E, KURC A R, FILSTRUP B, et al.An efficient synchronization mechanism for mirrored game architectures[J].Multimedia Tools and Applications,2004,23(1):7-30.

[2]BLOW J. A look at latency in networked games[J].Game Development,1998,5(7):28-40.

[3]ISHIBASHI Y, TASAKA S.Causality and media synchronization control for networked multimedia games: centralized versus distributed:proceedings of the 2nd Workshop on Network and System Support for Games[C].Redwood Ciyt:[s.n.],2003:42-51.

[4]BARRON T,LOST L. Multiplayer game programming[M]. Washington,D.C.:Course Technology PTR, 2002:406-408.

[5]BERNIER Y W.Latency compensating methods in Client/Server in-game protocol design and optimization [EB/OL].(2001-01).http://web.cs.wpi.edu/~claypool/courses/4513-B03/papers/games/bernier.pdf.

[6]SMED J, KAUKORANTA T,HAKONENH.A review on networking and multiplayer computer games[EB/OL].(2002-04).http://www.tucs.fi/publications/attachment.php%3ffname=TR454.pdf. 

注:“本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文”

主站蜘蛛池模板: 国产精品xxx| 亚洲欧美人成电影在线观看| 最近最新中文字幕在线第一页| 日本午夜在线视频| 精品福利网| 性色一区| 成人福利视频网| 亚洲精品黄| 五月激情综合网| 国产黄色免费看| a亚洲天堂| 精品视频在线观看你懂的一区| 精品国产一区91在线| 婷婷99视频精品全部在线观看| 国产一级在线观看www色| 欧美日韩成人在线观看| 亚洲日韩精品欧美中文字幕| 欧美成a人片在线观看| 国产福利小视频高清在线观看| 国产国模一区二区三区四区| www.狠狠| 欧美一级在线| 国产亚洲精品yxsp| 国产AV毛片| Jizz国产色系免费| 国产在线观看第二页| 天天躁夜夜躁狠狠躁图片| 制服丝袜无码每日更新| 性欧美精品xxxx| 欧美97欧美综合色伦图| 精品视频免费在线| 亚洲人成网站色7777| 精品人妻无码区在线视频| 国产精品刺激对白在线| 国产自在自线午夜精品视频| 国产精品v欧美| 热热久久狠狠偷偷色男同| 欧美日韩午夜| 精品无码一区二区三区电影| 99久久国产综合精品2023| 国产精品九九视频| 为你提供最新久久精品久久综合| 熟女成人国产精品视频| 新SSS无码手机在线观看| 嫩草在线视频| 国产欧美在线观看精品一区污| 狼友视频国产精品首页| 亚洲国产天堂在线观看| 2021国产精品自产拍在线| 欧美精品啪啪一区二区三区| 久久精品亚洲专区| 国产三级国产精品国产普男人| 午夜日b视频| 凹凸国产分类在线观看| 欧美第一页在线| 日本人妻一区二区三区不卡影院 | 97在线碰| 精品91视频| 波多野结衣一二三| 国产亚洲欧美另类一区二区| 日韩黄色大片免费看| swag国产精品| 无码粉嫩虎白一线天在线观看| 久久人人妻人人爽人人卡片av| 亚国产欧美在线人成| 久久亚洲美女精品国产精品| 国产成人毛片| 激情视频综合网| 亚洲男人在线| 色噜噜在线观看| 激情视频综合网| 91免费精品国偷自产在线在线| 亚洲第一色网站| 9啪在线视频| 国产精品免费久久久久影院无码| 国产区网址| 99久久精品免费视频| 亚洲美女操| 亚洲中文字幕精品| 精品亚洲欧美中文字幕在线看| 在线观看亚洲人成网站| 亚洲欧美日韩久久精品|