Quickserver是一個免費的開源Java庫,用於快速建立健壯的多線程、多客戶端TCP服務器應用程序。使用QuickServer,用戶能夠只集中處理應用程序的邏輯/協議
AMF/JSON/XML/自定義/ProtocolBuffer
不管是作何種網絡應用,必需要解決的問題之一就是應用層從字節流中拆分出消息的問題,也就是對於 TCP 這種字節流協議,接收方應用層可以從字節流中識別發送方傳輸的消息.
1.使用特殊字符或者字符串做爲消息的邊界,應用層解析收到的字節流時,碰見此字符或者字符串則認爲收到一個完整的消息
2.爲每一個消息定義一個長度,應用層收到指定長度的字節流則認爲收到了一個完整的消息
消息分隔標識(separator)、消息頭(header)、消息體(body)
len | message_id | data
|separator | header | body |
| len | message_id | data
8. 粘包:
TCP粘包是指發送方發送的若干包數據到接收方接收時粘成一包,從接收緩衝區看,後一包數據的頭緊接着前一包數據的尾。
1.發送方引發的粘包是由TCP協議自己形成的,TCP爲提升傳輸效率,發送方每每要收集到足夠多的數據後才發送一包數據。若連續發送幾回的數據都不多,一般TCP會根據優化算法把這些數據合成一包後一次發送出去,這樣接收方就收到了粘包數據。
2.接收方引發的粘包是因爲接收方用戶進程不及時接收數據,從而致使粘包現象。這是由於接收方先把收到的數據放在系統接收緩衝區,用戶進程從該緩衝區取數據,若下一包數據到達時前一包數據還沒有被用戶進程取走,則下一包數據放到系統接收緩衝區時就接到前一包數據以後,而用戶進程根據預先設定的緩衝區大小從系統接收緩衝區取數據,這樣就一次取到了多包數據
解決措施:
1.對於發送方引發的粘包現象,用戶可經過編程設置來避免,TCP提供了強制數據當即傳送的操做指令push,TCP軟件接收到該操做指令後,就當即將本段數據發送出去,而沒必要等待發送緩衝區滿;
TCP-NO-DELAY-關閉了優化算法,不推薦
2.對於接收方引發的粘包,則可經過優化程序設計、精簡接收進程工做量、提升接收進程優先級等措施,使其及時接收數據,從而儘可能避免出現粘包現象-當發送頻率高時依然可能出現粘包
3.接收方控制,將一包數據按結構字段,人爲控制分屢次接收,而後合併,經過這種手段來避免粘包。-效率低
4.接收方建立一預處理線程,對接收到的數據包進行預處理,將粘連的包分開
分包算法思路:
基本思路是首先將待處理的接收數據(長度設爲m)強行轉換成預約的結構數據形式,並從中取出數據結構長度字段,即n,然後根據n計算獲得第一包數據長度
1) 若n<m,則代表數據流包含多包數據,從其頭部截取n個字節存入臨時緩衝區,剩餘部分數據一次繼續循環處理,直至結束。
2) 若n=m,則代表數據流內容剛好是一完整結構數據,直接將其存入臨時緩衝區便可。
3) 若n>m,則代表數據流內容尚不夠構成一個完整結構數據,需留待與下一包數據合併後再行處理。
五.正文之場景管理、ai、腳本
AOI: (Area Of Interest),廣義上,AOI系統支持任何遊戲世界中的物體個體對必定半徑範圍內發生的事件進行處理;但MMOPRG上絕大多數需求只是對半徑範圍內發生的物體離開/進入事件進行處理。當你進入一個遊戲場景時,若是你能看到其餘玩家,那背後AOI系統就正在運做.
1. 很容易想象,AOI的需求最簡單的作法是全世界玩家信息所有同步給客戶端。這個方案是O(n^2)的複雜度,對服務器來講是不能承受之重。但若是是超小地圖十人如下的特殊需求倒多是個簡潔的方案。
2. 比較流行的方案是網格法,簡單,高效:將地圖按設定的格子大小劃分爲網格,設玩家移動到某座標,咱們很容易地將玩家納入該座標所屬的網格G的玩家鏈中,而這個玩家的可見集能夠簡單地將以網格G爲中心的九宮格中的玩家鏈聚合而獲得。而要得到兩次移動間的可見集差別,也非難事.
轉自雲風Blog:
所謂 AOI ( Area Of Interest ) ,大體有兩個用途。
一則是解決 NPC 的 AI 事件觸發問題。遊戲場景中有衆多的 NPC ,比 PC 大體要多一個數量級。NPC 的 AI 觸發條件每每是和其它 NPC 或 PC 距離接近。若是沒有 AOI 模塊,每一個 NPC 都須要遍歷場景中其它對象,判斷與之距離。這個檢索量是很是巨大的(複雜度 O(N*N) )。通常咱們會設計一個 AOI 模塊,統一處理,並優化比較次數,當兩個對象距離接近時,以消息的形式通知它們。
二則用於減小向 PC 發送的同步消息數量。把離 PC 較遠的物體狀態變化的消息過濾掉。PC 身上能夠帶一個附近對象列表,由 AOI 消息來增減這個列表的內容。
在服務器上,咱們通常推薦把 AOI 模塊作成一個獨立服務 。場景模塊通知它改變對象的位置信息。AOI 服務則發送 AOI 消息給場景
AOI 的傳統實現方法大體有三種:
第一,也是最苯的方案。直接按期比較全部對象間的關係,發現可以觸發 AOI 事件就發送消息。這種方案實現起來至關簡潔,幾乎不可能有 bug ,能夠用來驗證服務協議的正確性。在場景中對象不對的狀況下其實也是不錯的一個方案。若是咱們獨立出來的話,利用一個單獨的核,其實能夠按期處理至關大的對象數量。
第二,空間切割監視的方法。把場景劃分爲等大的格子,在每一個格子裏樹立燈塔。在對象進入或退出格子時,維護每一個燈塔上的對象列表。對於每一個燈塔仍是 O(N * N) 的複雜度,但因爲把對象數據量大量降了下來,因此性能要好的多,實現也很容易。缺點是,存儲空間不只和對象數量有關,還和場景大小有關。更浪費內存。且當場景規模大過對象數量規模時,性能還會降低。由於要遍歷整個場景。對大地圖不太合適。這裏還有一些優化技巧,好比能夠把格子劃分爲六邊形 的。
第三,使用十字鏈表 (3d 空間則再增長一個鏈表維度) 保存一系列線段,當線段移動時觸發 AOI 事件。算法不展開解釋,這個用的不少應該搜的到。優勢是能夠混用於不一樣半徑的 AOI 區域。
2.AI
1.怪物AI
2.NPC AI
3.世界環境AI
實現方法:狀態機
其餘:
尋路:A*
神經網絡
遺傳算法
3.腳本語言的選擇:
Lua/Python/Erlang
Groovy/JRuby/Scala/Fantom/JPython-五大基於JVM的語言
做用:可應用於部分應用層邏輯常常發生變化的系統。如任務系統。以在不須要從新編譯整個工程的狀況下調整、 測試和修改遊戲運行的機制和特性
六.正文之開源網絡遊戲服務器
魔獸世界模擬器
mangosTrinity TrinityCore2
天堂2模擬器
L2J
永恆之塔模擬器
Arianne
七.正文之參考書籍,博客
1.雲風Blog ttp://codingnow.com/ 2.書籍<大型多人在線遊戲開發><網絡遊戲服務器編程><UNIX網絡編程> 注:有部份內容來自網絡,謝謝大家!