首先XNA Network 通訊協定使用Reliable UDP,也就是一種可信賴的UDP架構,也是國外
常看到的network lib所使用的協定。國內我看過的lib大多是用TCP,可能跟遊戲類型有關,
國外的遊戲大宗以FPS為主,在傳輸上求快不求準,國內以MMORPG為大宗,傳輸的可靠性
是首要考量。TCP與UDP協定有太多正反的論戰,這不是本篇的重點,事實上良好的交互運用,
也能達到不錯的效果。通常使用UDP作為協定的lib,都會實作四種傳輸方式;
(1)不可信賴、沒次序的傳送。
(2)可信賴、沒次序的傳送。
(3)不信賴、有次序的傳送。
(4)可信賴、有次序的傳送
顧名思義,可信賴就是會當一段時間對方收不到時就會重發直到送達目的地(所謂可信賴就是不保證的意思,也就是說並不保證在所有情況下封包一定會送達,不過正常情況下是一定會送達)。次序當然就代表傳送的先後次序是被固定的,才不會有先送後收的情形。
如果你要用到第四個選項,表示做的事情不會少於TCP協定,可以視不同需求來選擇採用的方式。
在XNA 2.0裡面,Senddata參數裡面就可以設定:SendDataOptions.None、SendDataOptions.Reliable、SendDataOptions.InOrder、SendDataOptions.ReliableInOrder。
詳細網路使用範例可以看官網的兩個範例
Client/Server
P2P
這兩個範例非常類似,看一下Code就可以了解。
現在要來說說限制了,如果想用XNA的network lib來做PC網路遊戲的可能要失望了,我找不到可以指定Server IP的地方,也就是說它是自動搜尋的方式來相互連結。
在程式碼中,我們可以看到
networkSession = NetworkSession.Create(NetworkSessionType.SystemLink,
maxLocalGamers, maxGamers);
其中參數NetworkSessionType.SystemLink就是用來指定連結的方式,
有Local、SystemLink、Ranked、PlayerMatch四種。主要用到的就是SystemLink與PlayerMatch,
System Link可以搜尋區網內所有已建立的Session,PlayerMatch當然就是XBOX Live 上的配對。
但是使用PlayerMatch在Live上配對可是要錢的,不只要金會員的資格還要有Creator Club的會員,
所以官方的建議似乎是說在本機端開發時,就先用SystemLink吧,但Intranet環境跟Internet不同,該怎麼模擬呢?
XNA提供了好用的方式:
NetworkSession.SimulatedLatency = TimeSpan.FromMilliseconds(200);
NetworkSession.SimulatedPacketLoss = 0.1f;
第一行就是模擬封包的延遲時間,0.2秒。第二行就是封包遺失率,10%。
如何?挺方便的吧。
回頭想想。XNA的思維就是以PC跟XBOX連線為主,想用XNA做大型網路架構是不適合的。
當初在設計上就不是朝這個方向,而是類似Live的連線方式,所以如此的設計也就不覺得奇怪了。
假如想使用XNA設計MMORPG,使用.Net的Network物件,或是其他人封裝好的lib是比較適合的。
http://creators.xna.com/en-US/news/gdc2010
微軟在2010年的GDC會上發表Windows Phone 7,其中最令人矚目的就是XNA 4.0將支援該平台,蘋果已經在手機遊戲市場打下一片江山,微軟在後面苦苦追趕,XNA可能成為Windows Phone的秘密武器,如果還是無法吸引大量開發者投入其陣營,未來要急起直追只會更加困難,XNA使用C#語言比起iPhone的Objective C開發起來更有效率,且XNA4.0號稱可與XBOX Live互動,至於多大的互動就不得而知了,另外也會整合進Visual Studio 2010,讓開發工具更完整。
上面圖片就是一款微軟在大會上展示的一款遊戲,名為”The Harvest”,據說架構到XNA上花了三個禮拜的時間,真是不能小看微軟開發架構的威力,期待未來還能有更多資訊與詳細規格的發佈。
另外之前提到的專門將.Net framework port到iPhone上的MonoTouch,新版本支援預購火熱的iPad,並且已經在製作MonoDroid,表示未來在Android平台上使用.Net語言,這就表示如果未來XNATouch也做個port到android的版本,將可實現橫跨PC、Xbox360、iPhone、Android、Zune、Windows Mobile等跨平台的夢想,比Unity還強大(這句是玩笑話,Unity是完整的開發工具,XNA僅是程式框架,不可與之相提並論)。
sample code:
http://create.msdn.com/en-US/education/catalog/sample/network_cs