【Photon】官方Mmo文檔總結

http://cl314413.blog.163.com/blog/static/1905079762012102124637521/

前言:

本簡易文檔主要翻譯自Photon官方Mmo文檔,也加入了一些本身的理解和提示,之後會嘗試着用本身的項目來說一講具體的開發流程。固然。。水平問題,確定會有我不知道的錯誤,建議對照着英文原版來看。(雖然這貨耽誤了我兩個月時間,但仍是想說好值啊!)很少廢話了,直接開始。

1、基礎:興趣管理(Interest Management)

玩遊戲都知道,做爲一個在線遊戲來說,人物的走動是基礎中的基礎。然而,在虛擬世界中,一個東西位置發生變化會觸發位置更新消息。爲了在其餘客戶端展現這個東西是在流暢的運動,最少須要每秒10次的更新。

但問題在於,若是這個遊戲是成百上千人在玩的話。。。做爲客戶端來說確定不能讓它接受到全部人物移動的消息的,計算機會爆掉。。因此呢,興趣管理就是解決這個問題的好方法了。每一個客戶端都只獲取他想要的事件,也就是他所能看見的東西的事件。

wKioL1YxmSuxAzllAADs4cW72tY626.jpg

2、概念

遊戲中的虛擬世界(IWorld)有一個創建在座標基礎上的虛擬空間。

每一個座標都是被3D向量表現出來的。幾個座標定義了一個區域(IArea)。

每個在這個虛擬世界中存在的物體都被叫作「物品」(Item)。

客戶端用位置和範圍定義他們感興趣的區域,而且只能看到這個興趣區域(Interest Area)範圍內的物品。

wKiom1YxmPaA5ZZZAABqhUQBOUM485.jpg

思路來了,可是呢,計算哪些物品進入哪些興趣區域會很是消耗CPU資源,尤爲當物品和興趣區域在快速的運動的時候。

一個加快這個計算過程的簡單方法就是把虛擬空間劃分紅一些固定地帶(fixed Regions)而後只計算哪些地帶和興趣區域是重疊的。

客戶端會接收到全部重疊地帶中的事件。

而這,就是傳說中的貼圖算法了(Square Tile Algorithm)。

wKioL1YxmSvD8HwcAACgnnXA2DA410.jpg

一旦一個物品出如今了特定的興趣區域的邊界以內,這個興趣區域就會自動的把客戶端實例(peer)和這個物品的事件頻道(event channel)相訂閱。

客戶端從這一刻起就會收到全部被這個物品或者經過它發送的消息。

若是一個物品是在興趣區域的邊界來回晃悠的話,極可能就會形成頻繁的訂閱和未訂閱的變化。爲了解決這個問題,一個附加的更大的興趣範圍(interest area radius)就這麼被創造出來了。已訂閱的物體若是出了這個範圍那就再也不被訂閱,客戶端也就再也不接收它的事件。

wKiom1YxmPajgE9ZAAChu5UX4YQ663.jpg

3、Photon MMO 功能

    一、基於地帶(region)的興趣管理

       使用貼圖算法,長度和寬度可變,而且平鋪尺寸也已經實現好了(tile size is implemented)

       很方便用其餘的地帶算法取代默認的貼圖算法。

    二、物品(角色,NPC,共享的遊戲對象)【Items(Avatars,NPCs,shared game objects)】

       客戶端能夠產生、銷燬或者移動物品。

       物品具備能夠被其餘客戶端讀取以及被全部者更改的屬性。

       物品屬性裏有一個修訂號碼(revision number),客戶端若是在必定時間內看不到一個物體了,能夠把修訂號碼進行比較,以此決定接不接受該物品屬性的更新。

    三、興趣區域:物品的事件在興趣區域中是被自動接收的

       興趣領域有兩個興趣界點(interestthresholds)。物品進入裏面的興趣區域邊界(inner radius)會變的可視,離開外面的興趣範圍就會變得不可視。這會最優的減小頻繁的可視狀態變化。

         wKioL1YxmSzQwC2PAACwYVFN37w546.jpg

          1 不可視物品,範圍以外

          2 不可視物品進入外圍興趣區域

          3 不可視物品進入內部興趣區域變得可視了

          4 可視物品離開內部興趣區域

          5 可視物品離開外圍興趣區域變得不可視了

      興趣區域能夠被從新設置範圍大小:調整視野範圍以適應能看見的物品的數量

          爲了提升在擁擠區域內的程序性能

          在物品比較稀少的區域能夠展現較遠的物品。

      興趣區域能夠附加給任何物品:不管是在物品移動了興趣區域以後仍是改變了興趣區域自己。這對自己的角色移動興趣區域尤爲有用。(Whenever the item moves the interest area follows and changes theinterest accordingly. This is especially useful to move the interest area withthe own avatar.)

      已分離的興趣區域能夠被自由的移動,這對攝像機漫遊頗有幫助。

      客戶端能夠有多個興趣區域在同一時間展現世界的不一樣部分。

   四、自動的興趣管理

      客戶端能夠自動的申請或者取消掉物品的興趣區域。(Clients can manually (un-)declare interest in items.)

   五、自定義事件(Custom events)能夠經過物品發送到兩個可能的目標

      物品的擁有者全部對物品感興趣的客戶端

   六、最優化的位置更新機制:客戶端只會在物品移動的時候纔會發送更新消息。

   七、複製用戶的確認信息:發生在後的用戶鏈接會重置以前的鏈接信息。(Duplicate user recognition: A subsequent user connection resets theprevious con-nection.)

4、狀態機(StateMachine)

   一個客戶端實例peer有以下的狀態。

一、  Connected:在鏈接以後的初始狀態,玩家尚未進入世界。

二、  WorldEntered:在向服務端發出EnterWorld的請求之後,玩家進入世界。

三、  Disconnected:客戶端未鏈接。

wKioL1YxmSzwNmapAACfsBTBOhs905.jpg

           Peer實例爲每個狀態使用一個不一樣的申請句柄(operation handler)。這容許申請在每一個狀態下表現的不一樣。下面是用到的申請句柄。

  1. State     Connected: Photon.MmoDemo.Server.MmoPeer

  2. State     WorldEntered: Photon.MmoDemo.Server.MmoActor

  3. State     Disconnected: Photon.SocketServer.Rpc.OperationHandlerDisconnected

           客戶端應該在呼叫一個狀態變化申請以後一直等待與之關聯的申請返回或者事件(operation response / event)。客戶端實例peer的狀態和如今的申請句柄【operationhandler (operation behavior)】在沒有接收到返回或者事件是不會被確認的。EnterWorld申請將會返回一個申請返回,ExitWorld申請將會返回一個事件WorldExited。

   5、白楊的話

       一、整個的MMO項目(包括客戶端和服務端)就在photon服務端SDK的src-server文件夾下。右鍵sln解決方案,用VS2010打開就能夠看到了。

          wKioL1YxmaCyXiyIAAD6q8Eitaw932.jpg

           我第一次看的時候一會兒就懵了。。這忒複雜了吧,都什麼啊。。。

           可是後來慢慢探索就明白各個項目的關係了。

           簡單的來講,Client.DotNet的項目內容和Client.Unity3D等同。是客戶端例子的基礎,已經封裝好了peer初始化、operation申請、興趣區域等基礎類。這兩個項目編譯出來之後都是一個單獨的類庫,是後面那三個client例子用的。Client例子的任務就是引用基礎類庫,開發更加圖形化的功能,好比Radar(物品雷達,用來管理地圖上的物品,畫小地圖)。

           MmoDemo.Common和MmoDemo.Server都是服務端的內容。Common定義了幾個用來傳送事件的ID或Code枚舉。而Server就主要是用來實現服務端邏輯了。

        二、如何用這貨來開發MMO功能呢?

           舉例來講,如何開發一個簡單的登錄註冊功能?

           大概思路以下:(這裏只是簡述,確定不完整,我會爭取在個人項目比較穩定之後用項目來講明)

1)  在client基礎類庫項目的GameStateStrategies中加入一個新狀態類Login.cs。

2)  在項目的Operations.cs中實現入一個新的傳送用戶名和密碼的方法,注意,這裏你使用的OperationCode服務端還沒法識別,先記下。過程當中別忘了新狀態。

3)  在你要更改的例子中,在enterworld以前調用這一方法。

4)  來到服務端的common,在OperationCode.cs之中定義好你剛纔在客戶端中傳送的OperationCode,還要分別在ErrorCode和EventCode中給這個登陸方法加一個申請返回和事件回覆的Code。

5)  再來到server,在Operations中加入判斷登陸信息的新類,在Events中加入返回成功失敗消息的新類。過程當中仍是別忘了判斷Login狀態。

三、  至於用什麼數據庫。。。能力有限,一直用的都是LINQ To SQL,架設比較方便,在photon中使用也很簡單,這方面的技術查閱C#紅皮書或者新出的數據庫技術的書就好。不過目測這貨已通過時了,因此。。也不是太敢肯定會一直用它,慢慢來,比起各類缺文檔的photon,數據庫好學多了不是麼!

相關文章
相關標籤/搜索