• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            不會(huì)飛的鳥

            2010年12月10日 ... 不鳥他們?。。?我要用自己開(kāi)發(fā)的分布式文件系統(tǒng)、分布式調(diào)度系統(tǒng)、分布式檢索系統(tǒng), 做自己的搜索引擎?。?!大魚有大志?。。?---楊書童

            游戲引擎基礎(chǔ)(七)(網(wǎng)絡(luò)和連線游戲環(huán)境)

            7部份: 網(wǎng)絡(luò)和連線游戲環(huán)境


            網(wǎng)絡(luò)游戲
              我記得一些年前坐在GDC(游戲開(kāi)發(fā)者大會(huì))聽(tīng)負(fù)責(zé)開(kāi)發(fā)X-Wing Vs TIE Fighter的家伙們題為淹沒(méi)在Internet” 的演講,全是關(guān)于讓網(wǎng)絡(luò)游戲?qū)崟r(shí)地在Internet上工作的東西。他們選擇那個(gè)題目是多么的正確啊。當(dāng)它開(kāi)始處理數(shù)據(jù)包的丟失,亂序,潛伏(一個(gè)數(shù)據(jù)包發(fā)送到它的目的地所花的時(shí)間)等等時(shí),它確實(shí)淹沒(méi)了。然而它是可能的。對(duì)于Internet需要一些聰明和經(jīng)驗(yàn),但它是肯定可能的??纯唇裉齑罅康倪B線游戲,從Quake III,Unreal Tournament,Counter Strike一直到EverQuestUltima Online。

              如今大多數(shù)真正有長(zhǎng)久生命力的游戲都至少有一些連線成分。最純粹的單人游戲容易玩一次,也許兩次,或者甚至三次如果它是非常好的游戲,但一旦游戲結(jié)束,就被束之高閣了。如果你想要有任何長(zhǎng)久生命力,那么多人連線游戲就是形勢(shì)的核心所在,并且那意味著和Internet打交道,為編碼者打開(kāi)了那個(gè)潘多拉的盒子。

              那么跟Internet打交道包括些什么呢?首先是要理解Internet是怎么工作的,和點(diǎn)對(duì)點(diǎn)與客戶機(jī)/服務(wù)器體系結(jié)構(gòu)的快速討論。點(diǎn)對(duì)點(diǎn)就是你在兩臺(tái)機(jī)器上運(yùn)行游戲,并簡(jiǎn)單地在它們之間共享輸入。每個(gè)單獨(dú)的游戲假定它是正確的,并僅僅在它一幀接一幀的刷新中合并來(lái)自另外一臺(tái)機(jī)器的輸入??蛻魴C(jī)/服務(wù)器是一臺(tái)機(jī)器有效地運(yùn)行游戲,別的機(jī)器僅僅是一個(gè)終端,接受來(lái)自玩家的輸入,并渲染服務(wù)器讓它渲染的任何東西。

              客戶機(jī)/服務(wù)器的優(yōu)點(diǎn)是每臺(tái)機(jī)器都將會(huì)展現(xiàn)相同的游戲,因?yàn)樗械奶幚矶荚谝粋€(gè)地方完成,沒(méi)有跨越多臺(tái)機(jī)器,你可以不用考慮每臺(tái)機(jī)器相互之間的同步問(wèn)題。不足之處是,服務(wù)器本身需要有一些重要的CPU可用時(shí)間來(lái)處理每一個(gè)連接的客戶機(jī),和一個(gè)合適的網(wǎng)絡(luò)連接來(lái)確保每一個(gè)客戶機(jī)及時(shí)地接收到它的更新。


            了解IP
              我們都已經(jīng)聽(tīng)說(shuō)過(guò)TCP/IP(傳輸控制協(xié)議/網(wǎng)間協(xié)議)和UDP(用戶數(shù)據(jù)包協(xié)議), Web網(wǎng)絡(luò)上有大量關(guān)于這些協(xié)議的深?yuàn)W的技術(shù)資訊。實(shí)際上,在Cisco網(wǎng)站上有一些極好的TCP/IP指導(dǎo)。我們將在較高層面上介紹一些TCP/IP的基本知識(shí),目的是讓你更好地了解使用這些標(biāo)準(zhǔn)協(xié)議的網(wǎng)絡(luò)游戲設(shè)計(jì)者面臨的挑戰(zhàn)。

              TCP/IPUDP/IP是兩層的通信協(xié)議系統(tǒng)。IP層負(fù)責(zé)網(wǎng)際數(shù)據(jù)包的傳輸。UDP或者TCP層將大的數(shù)據(jù)包傳給IP,IP將數(shù)據(jù)包分割為小的子數(shù)據(jù)包,為每個(gè)數(shù)據(jù)包加上一個(gè)信封,計(jì)算出目的地的IP地址,應(yīng)該如何到達(dá)那里,然后將數(shù)據(jù)包發(fā)送到你的ISP,或者不管怎樣你連接到網(wǎng)絡(luò)。 這實(shí)在象是在一張明信片上寫下你要發(fā)送的,貼上郵票,寫上地址,塞進(jìn)一個(gè)郵箱,它就送走了。

              UDPTCP是從你編碼者或者游戲接收數(shù)據(jù)包的高層協(xié)議,并決定該如何處理這些數(shù)據(jù)包。UDPTCP的區(qū)別在于TCP保證數(shù)據(jù)包的傳送和有序,而UDP不保證。UDP是一條直接和IP對(duì)話的小路,而TCP是在你和IP之間的一個(gè)接口。它像是在你和你的郵件之間有一個(gè)管理員助手。使用UDP你會(huì)自己為你的信打字,把它們放進(jìn)一個(gè)信封等等。使用TCP你會(huì)僅僅向你的管理員口授信稿,管理員會(huì)做全部的工作并追蹤確認(rèn)信件送到了。

              然而,所有這些令人驚奇的為你完成的工作伴隨著代價(jià)。為了確定數(shù)據(jù)包通過(guò)Internet完好無(wú)損地送到了目的方,TCP期待從目的方為它發(fā)送的每個(gè)數(shù)據(jù)包發(fā)回一個(gè)應(yīng)答包(網(wǎng)絡(luò)用語(yǔ)是ACK)。如果它在一定時(shí)間內(nèi)沒(méi)有收到ACK,它就停止發(fā)送任何新的數(shù)據(jù)包,重新發(fā)送丟失的數(shù)據(jù)包,并且將繼續(xù)這樣做直到收到目的方的回應(yīng)。當(dāng)你訪問(wèn)一個(gè)網(wǎng)頁(yè)時(shí),我們都已經(jīng)看到了這種情形,在半途中下載停止了一會(huì)然后又重新開(kāi)始了。可能是一個(gè)數(shù)據(jù)包在什么地方丟失了(假定不時(shí)ISP的問(wèn)題),在任何更多的數(shù)據(jù)包被發(fā)送以前TCP要求重新發(fā)送它。

              這一切的問(wèn)題是,在認(rèn)識(shí)到出了差錯(cuò)的發(fā)送者和實(shí)際上正在送達(dá)的數(shù)據(jù)包之間出現(xiàn)了延遲。有時(shí)這能花上數(shù)秒鐘,如果你僅僅只是下載一個(gè)文件或一個(gè)網(wǎng)頁(yè),這不是什么大礙,但如果這是一個(gè)游戲數(shù)據(jù)包而且每秒至少有十次,那么你真的是遇到麻煩了,尤其是因?yàn)樗V沽似渌磺惺虑椤?shí)際上就是這個(gè)問(wèn)題所以幾乎沒(méi)有游戲選擇使用TCP作為它們主要的Internet協(xié)議,除非它不是一個(gè)實(shí)時(shí)動(dòng)作游戲。大多數(shù)游戲使用 UDP--他們不能保證有序或可靠送達(dá),但它確實(shí)很快或者結(jié)果是至少通常比TCP/IP更快。現(xiàn)在我們了解這些了,接下來(lái)呢?


            客戶端預(yù)測(cè)
              因?yàn)?/span> UDP 明顯的是快速響應(yīng)游戲的方式,我們將必須自己處理數(shù)據(jù)包的丟失和亂序。邊而且這是技巧所在。不用說(shuō)出太多的代碼秘密,我就能說(shuō)有方法。作為開(kāi)始,有客戶端預(yù)言,一個(gè)被談?wù)摰孟喈?dāng)多的詞語(yǔ)。當(dāng)你作為一個(gè)客戶端連接到一個(gè)大的服務(wù)器,但是不能連貫地看見(jiàn)來(lái)自服務(wù)器的更新,客戶端預(yù)言開(kāi)始起作用了。正在你的電腦上運(yùn)行的游戲部分看著你正給它的輸入,并在缺乏來(lái)自服務(wù)器的任何棄絕信息的情況下,對(duì)它認(rèn)為將繼續(xù)進(jìn)行的事情作出最好的猜測(cè)。它將會(huì)顯示被猜測(cè)的數(shù)據(jù),然后當(dāng)它得到來(lái)自服務(wù)器的世界的最新?tīng)顟B(tài)時(shí),改正它自己,如果需要。你可能會(huì)對(duì)這個(gè)方法的效力感到驚訝。大體而言,大部分時(shí)間數(shù)據(jù)包不容易丟失大多數(shù)時(shí)候是一秒的幾十分之一,這種情況下游戲沒(méi)有太多的時(shí)間偏離服務(wù)器實(shí)際上認(rèn)為正在發(fā)生的事情。偏離確實(shí)會(huì)隨著時(shí)間變的比較大,大多數(shù)游戲里面有一個(gè)超時(shí)功能,當(dāng)出現(xiàn)很長(zhǎng)時(shí)間沒(méi)有來(lái)自服務(wù)器的聯(lián)絡(luò)時(shí)就停止游戲。

              你正在創(chuàng)造的游戲類型在這里有關(guān)系 -- 第一人稱射擊游戲不需要這樣有效的客戶端預(yù)言,因?yàn)樗鄶?shù)情況下僅僅處理我在哪兒,我是否要射擊?。在第三人稱游戲中,你必須更加精確,因此你能夠正確地預(yù)測(cè)你的角色正在播放的動(dòng)畫,并且動(dòng)作流暢。在這種情形中流暢的動(dòng)畫是完全必要的。Heretic II在這方面有很大的問(wèn)題,并且是當(dāng)它開(kāi)始網(wǎng)絡(luò)編碼時(shí)Raven一直不得不處理的最困難的事情之一。

              當(dāng)然如果你有一個(gè)很不錯(cuò)的網(wǎng)絡(luò)連接,比如寬帶連接,那么這個(gè)問(wèn)題就遠(yuǎn)沒(méi)有那么重要。對(duì)比較大的數(shù)據(jù)包有一個(gè)更寬的管道,對(duì)你的網(wǎng)絡(luò)連通時(shí)間更快速。事實(shí)上,寬帶對(duì)于游戲的主要優(yōu)點(diǎn)不比較胖的管道多,但大大減少了延遲,特別是你到ISP的第一跳上。對(duì)于56K 調(diào)制解調(diào)器,第一跳典型的延遲是100ms,這已經(jīng)嚴(yán)重地增加了你到網(wǎng)絡(luò)上任意一臺(tái)游戲服務(wù)器的潛在連通時(shí)間。對(duì)于寬帶連接比如像DSL,第一跳的延遲時(shí)間多半是20ms。使用Windows中一個(gè)叫做TraceRouteTRACERT.EXE)的命令行程序并指定一個(gè)目標(biāo)IP地址或者域名,你能夠找出你的第一跳的連通時(shí)間。仔細(xì)觀察第一跳,因?yàn)檫@幾乎總是你到你的ISP的網(wǎng)絡(luò)連通時(shí)間。并且觀察你在你的ISP的網(wǎng)絡(luò)內(nèi)部用了多少跳直到你看見(jiàn)在一個(gè)給定跳上列出的一個(gè)不同的域名。

              請(qǐng)注意,寬帶并不總是能解決延遲問(wèn)題。你仍然受最慢的路由器/服務(wù)器和數(shù)據(jù)包從服務(wù)器穿越網(wǎng)絡(luò)到達(dá)你的跳數(shù)(反之亦然)的支配。有一個(gè)寬帶連接確實(shí)容易緩和這些,但不可能它們最后就消失了。當(dāng)然,如果你打算要運(yùn)行某種服務(wù)器,你將會(huì)需要一個(gè)具有足夠快速的向上游的數(shù)據(jù)速率的帶寬,因?yàn)閮H僅一個(gè)調(diào)制解調(diào)器不能夠處理一個(gè)服務(wù)器產(chǎn)生的負(fù)荷。

              值得一提的是,如果你想要在PS2或者Xbox上面玩網(wǎng)絡(luò)游戲,你將需要一個(gè)寬帶連接,因?yàn)樗鼈儍烧叨疾恢С终{(diào)制解調(diào)器。


            包大小,智能數(shù)據(jù)傳輸,和反作弊
              別的必須被處理的事情是數(shù)據(jù)包的大小。如果你在一個(gè)游戲里面64個(gè)人都在跑來(lái)跑去相互攻擊,從一臺(tái)機(jī)器發(fā)送到另外一臺(tái)機(jī)器的數(shù)據(jù)包能變得相當(dāng)大,達(dá)到了一些調(diào)制解調(diào)器沒(méi)有帶寬處理這些數(shù)據(jù)的程度。這正在變得特別和那些有著很大的地表系統(tǒng)的游戲有關(guān)。這里增加的問(wèn)題是,因?yàn)槟阌羞@個(gè)很好的地表系統(tǒng),你能夠看得很遠(yuǎn),因此能夠看見(jiàn)許多其他游戲玩家,使得你為了精確渲染所需要的來(lái)自服務(wù)器的數(shù)據(jù)數(shù)量以很快的速率增長(zhǎng)。我們能做什么呢?

              好吧,首先必要的是只發(fā)送絕對(duì)必須的東西給任何給定的客戶端,因此他僅僅得到從他的角度觀察游戲所需要的東西。發(fā)送在他視野以外的人們的數(shù)據(jù)沒(méi)有一點(diǎn)意義他將看不見(jiàn)這些。同時(shí),你最好確保只發(fā)送那些每幀之間實(shí)際上發(fā)生改變的數(shù)據(jù)。如果一個(gè)家伙仍然在播放相同的動(dòng)畫,重新發(fā)送數(shù)據(jù)沒(méi)有意義。當(dāng)然,如果數(shù)據(jù)包丟失時(shí)這確實(shí)帶來(lái)一些問(wèn)題,但這就是為什么好的網(wǎng)絡(luò)程序員被支付很多金錢,來(lái)處理類似這樣的東西。

              還有一些其他的事情也要處理。最近已經(jīng)有大量的令人苦惱的連線作弊正在發(fā)生。這是某些人修改游戲以給他們不正當(dāng)利益的地方。盡管嚴(yán)格意義上這不是網(wǎng)絡(luò)的一部分,但它確實(shí)發(fā)生了。有時(shí)人們會(huì)創(chuàng)作一些模塊,允許他們立即瞄準(zhǔn)進(jìn)入視野的任何人,或者簡(jiǎn)單地允許他們看穿墻壁,或者讓其他游戲玩家看不見(jiàn)他們自己。大部份時(shí)間這些事情可以在網(wǎng)絡(luò)層內(nèi)部或者在服務(wù)器上被處理。任何有100%命中率的人被簡(jiǎn)單地踢出游戲,因?yàn)樵谌肆λ暗姆秶鷥?nèi)那是不可能的。

              游戲開(kāi)發(fā)者必須盡一切可能制止作弊行為,但很不幸,人做的東西可以被人突破。所有你能做的就是讓作弊變得困難,當(dāng)確實(shí)發(fā)生時(shí)去嘗試發(fā)現(xiàn)它。

              好吧,現(xiàn)在就到這里了。在第8部分中,我們將會(huì)看看游戲腳本系統(tǒng)的趣味世界,根據(jù)游戲過(guò)程中出現(xiàn)的事件來(lái)渲染或使能預(yù)先定義的場(chǎng)景和行為,協(xié)助故事敘述。



            夢(mèng)在天涯 2007-12-04 13:24 發(fā)表評(píng)論

            posted on 2009-04-10 10:44 不會(huì)飛的鳥 閱讀(136) 評(píng)論(0)  編輯 收藏 引用

            人妻无码αv中文字幕久久琪琪布| 伊人久久大香线蕉av不卡| 久久亚洲熟女cc98cm| 精品乱码久久久久久夜夜嗨| 欧美午夜精品久久久久免费视 | 久久久精品国产sm调教网站| 亚洲日韩中文无码久久| 国产偷久久久精品专区| 精品久久久久久无码人妻热| 久久久久无码专区亚洲av| 亚洲精品无码专区久久久| 久久久精品国产亚洲成人满18免费网站 | 久久亚洲国产成人精品性色| 久久久久国产精品麻豆AR影院 | 久久夜色精品国产亚洲| 国产精品久久久久久久久鸭 | 久久性精品| 久久久久久噜噜精品免费直播| 99久久99这里只有免费的精品| 中文成人久久久久影院免费观看| 久久精品免费网站网| 久久99亚洲综合精品首页| 久久久久无码精品| 色欲综合久久躁天天躁蜜桃| 久久久无码人妻精品无码| 久久不见久久见免费视频7| 99久久久精品| 亚洲国产高清精品线久久 | 欧美日韩精品久久久免费观看| 国产精品久久久久久久久久影院 | 无码日韩人妻精品久久蜜桃| 大伊人青草狠狠久久| 尹人香蕉久久99天天拍| 亚洲国产成人久久综合一| 国产精品成人久久久| 久久久久国产一区二区三区| 午夜不卡久久精品无码免费| 伊人色综合久久天天人守人婷| 久久天天躁狠狠躁夜夜2020老熟妇| 久久精品水蜜桃av综合天堂| 少妇高潮惨叫久久久久久|