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格式閱讀原文”

主站蜘蛛池模板: 国产夜色视频| 最新国产成人剧情在线播放| 精品无码专区亚洲| 欧美中文字幕在线视频 | 色综合热无码热国产| 国产精品高清国产三级囯产AV| 一本大道无码高清| 亚洲精品在线观看91| 亚洲一区波多野结衣二区三区| 精品一区二区三区四区五区| 亚洲第一视频网站| 国产精品女在线观看| 亚洲日韩在线满18点击进入| 999精品视频在线| 中文字幕av一区二区三区欲色| 国产欧美专区在线观看| 五月天综合网亚洲综合天堂网| 久久青草精品一区二区三区| 亚洲视频免费播放| 久久免费视频6| 久久女人网| 亚洲精品成人7777在线观看| 色噜噜狠狠狠综合曰曰曰| 国产精品成人一区二区不卡| 伊人网址在线| 91视频精品| 久久久久国产一级毛片高清板| 40岁成熟女人牲交片免费| 国产精品免费p区| 伊人久久大香线蕉影院| 久久综合婷婷| 免费人成在线观看视频色| 四虎国产精品永久一区| 日韩资源站| 毛片大全免费观看| 国产精品成人久久| 久久这里只精品热免费99| 粉嫩国产白浆在线观看| 亚洲Aⅴ无码专区在线观看q| 久久无码av一区二区三区| 无码中字出轨中文人妻中文中| 久996视频精品免费观看| 99热这里只有精品免费| 亚洲青涩在线| 日韩欧美一区在线观看| 国内精自视频品线一二区| 欧美在线视频a| 欧美国产日韩在线| 欧美中文字幕一区| 精品视频一区二区三区在线播| 中日无码在线观看| 国产免费观看av大片的网站| 国产精品成人AⅤ在线一二三四| 亚洲欧美一区二区三区图片| 色吊丝av中文字幕| 国产毛片高清一级国语| 天堂在线视频精品| 91福利片| 亚洲美女高潮久久久久久久| 欧美国产三级| 国产毛片一区| 国产成本人片免费a∨短片| 67194亚洲无码| 狠狠做深爱婷婷久久一区| 久久青草视频| 无码专区在线观看| 亚洲成人精品在线| 久久99国产综合精品1| 成年女人18毛片毛片免费| 亚洲精品久综合蜜| 国产色婷婷视频在线观看| 91免费片| 色婷婷视频在线| 欧美亚洲香蕉| 五月激情婷婷综合| 久久久噜噜噜| 毛片网站观看| 在线观看91精品国产剧情免费| h网站在线播放| 国产杨幂丝袜av在线播放| 亚洲无码一区在线观看| 四虎国产永久在线观看|