一個簡單的游戲服務器框架

最近看到百度空間的一個帖子,不錯,在這里整理下,轉載至我的博客里,開始自己慢慢琢磨寫一個框架。

我先從上層結構說起,一直到實現細節吧,想起什么就寫什么。

第一部分 服務器邏輯
服務器這邊簡單的分為三個部分,客戶端的連接首先到達網關服務器,網關這里有個線程用來監聽來自與客戶端的連接,然后在將這些數據發送到游戲邏輯服務器上,這個邏輯游戲服務器上,數據的交互就是通過與數據服務器進行交互。RecordServer專門用來處理與數據庫的連接,查詢這些事情。當然為了游戲服務器能夠最大程度的不卡,肯定就得規定好網關服務器上的連接數量,免得像我們號稱流暢的鐵道部訂票網絡一樣做個卡B,想想玩一局dota被卡的悲劇吧。當我們要做一個大型網游時,這三個服務器顯然不夠。當然在自己寫的小游戲的時候就無所謂了,幾個服務器全部架設在自己的破筆記本上,不就是啟動幾個程序而已。

這個感覺寫得就差不多了,到細節吧。

第二部分 實現細節

這個就比較亂了,零零散散的,隨便寫了。這里很多都是對各種工具的封裝,以便于自己 在項目的使用

1.make

項目這么多目錄,這么多子目錄,肯定得用工具去編譯了,使用aclocal,automake,autoconf,make,就把我們的程序編譯好了,編寫自己configure.in文件,定義編譯選項、鏈接庫等等一系列亂七八糟的東西,然后對每個需要編譯的子項目編寫Makefile.am,有的需要要編譯成庫的,比如base等基類這些,其他的都編譯成可執行文件了,GatewayServer,LogicalServer,RecordServer。

2.套接字封裝,epoll使用

linux里,我們使用socket來讀寫網絡上的數據,這個很簡單了,gateway上一個客戶端連接過來,我們就為它分配一個socket 描述符了,在網關上,一個線程用來accept,一個線程用來做數據的處理,當accept一個連接請求后,放到數據處理的線程,接受到一個數據,然后直接轉發到logical server上,我們使用epoll_wait,來處理套接上的讀寫處理。每n ms處理一次循環,每次循環中使用一次epoll_wait,一次把這些有事件的socket取出來。

3.數據加密解密,壓縮解壓

對網絡上的數據,為了保證安全性,必須對它們進行加密解密處理,這個簡單了,網上各種內容,這里就不說了(全部寫完了,有時間再寫)。對數據進行壓縮,能減少帶寬吞吐,就是簡單的調用幾個zlib函數的調用,不細說,在前面轉發的《zlib使用》中有講,發現自己太懶,實在是懶得打字了。

4.線程封裝,互斥量,讀寫鎖

這些都是簡單的使用RAII或其他方式,對這些東西進行一次本地封裝。(應該得寫一個線程池去管理這些線程,todo)

5.數據庫封裝

使用mysql,使用mysql的C API函數,這個必須得封裝一下,不是每次數據的處理,都得去做很多事情,實現一個本地的數據的Field(列),Record(記錄),Table(表),DataBase(數據庫),RecordSet(查詢結果集)。制作一個數據庫連接句柄MysqlHandle,處理對數據庫的連接,處理等,實現一個HandlerPool,,每次從Pool中取出一個句柄來對數據庫進行查詢,免得每次都去重新連接,什么的。

6.自己的內存池

在之前分享的文章中《內存池技術詳解》《編寫自己的內存分配器》,自己的《內存池應用》,已經很詳細的說明了,內存池的制作,當然我在這里還是有一些改動的,但是大概思路就是這些了。

7.有一個狀態機的實現

這個也在自己之前寫的那個狀態機相關的文章里,也做記錄了。哈哈,實在是不想繼續碼字了,但是還是堅持下去。

8.lua與c++交互框架

這個暫時寫了一半,等全部完成了,再來弄,反正就是像npc處理這些,腳本處理這些,使用tolua++。

9.tinyxml封裝,正則表達式封裝

tinyxml一個輕量級的xml解析器,很簡單,反正是把這些現成的東西拿來自己用。正則表達式沒有進入c++標準,但是還是很多現成的正則表達式的處理,直接用linux庫下的regex.h,就是編譯正則表達式,匹配結果這些,

10.log系統

一個項目怎么能沒有自己的日志系統呢,反正就是打日志,往文件里面寫東西,用std::fstream輕松搞定,定義好日志級別:error / debug / fatel / info這些

11.時間封裝

這個必須有,否則自己還每次去調用get_clocktime,gmtime,time各種函數呀。

12.使用boost庫里的,Noncopyable,Singleton這些設計方法,來寫我們的代碼

13.定義好各種信號句柄,信號發生時采用什么策略,如SIGPIPE,做忽略處理

待續。。。。。。。。(睡覺了)

游戲服務器技術應該算來已經很成熟了,相比客戶端,它的技術更新速度很慢了。客戶端這邊,技術很多,各種游戲引擎比如3D的虛幻這些,什么粒子引擎,聲音這些,頁游的flash, html5,utility,,太多了,搞不過來呀。我先把服務器這邊好好專專,其他的等以后再說吧。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/445044.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/445044.shtml
英文地址,請注明出處:http://en.pswp.cn/news/445044.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

堆和棧的精華大總結

Java內存分配原理 棧、堆、常量池雖同屬Java內存分配時操作的區域,但其適用范圍和功用卻大不相同。 一般Java在內存分配時會涉及到以下區域: ◆寄存器:我們在程序中無法控制 ◆棧:存放基本類型的數據和對象的引用,但…

算法(11)-leetcode-explore-learn-數據結構-鏈表的經典問題

leetcode-explore-learn-數據結構-鏈表31.反轉一個鏈表2.移除鏈表元素3.奇偶鏈表4.回文鏈表5.小結本系列博文為leetcode-explore-learn子欄目學習筆記,如有不詳之處,請參考leetcode官網:https://leetcode-cn.com/explore/learn/card/linked-l…

探索式軟件測試

James A.Whittaker [美] 詹姆斯惠特克(軟件測試領域絕對的大師)著作《Exploratory Software Testing》,中文名《探索式軟件測試》,記得當時被這本書深深吸引啦(我不知道有多少做測試的小伙伴看過這本書)&am…

Linux線程池的設計

我設計這個線程池的初衷是為了與socket對接的。線程池的實現千變萬化,我得這個并不一定是最好的,但卻是否和我心目中需求模型的。現把部分設計思路和代碼貼出,以期拋磚引玉。個人比較喜歡搞開源,所以大家如果覺得有什么需要改善的…

算法(12)-leetcode-explore-learn-數據結構-雙鏈表的設計

leetcode-explore-learn-數據結構-鏈表4雙鏈表的設計本系列博文為leetcode-explore-learn子欄目學習筆記,如有不詳之處,請參考leetcode官網:https://leetcode-cn.com/explore/learn/card/linked-list/所有例題的編程語言為python 雙鏈表的設…

安全方面知識

什么是文件上傳漏洞 文件上傳漏洞是指 由于程序員在對用戶文件上傳部分的控制不足或者處理缺陷,而導致的用戶可以越過其本身權限向服務器上上傳可執行的動態腳本文件 這里上傳的文件可以是木馬,病毒,惡意腳本或者WebShell等。 這種攻擊方式是…

CE游戲外掛工具

CHEAT ENGINE(以下簡稱CE)是我見過的最優秀的游戲作弊工具。它的優點多不勝數,雖然單獨從搜索游 戲里面的數值來說,它并不比其他同類軟件強多少,但它不僅僅是個游戲修改工具,它還有其他游戲修改軟件所沒有的一些特點,例…

外掛編程-動作模擬技術

幾乎所有的游戲都有大量繁瑣和無聊的攻擊動作以增加玩家的 功力,還有那些數不完的迷宮,這些好像已經成為了角色游戲的代名詞。現在,外掛可以幫助玩家從這些繁瑣而無聊 的工作中擺脫出來。 1. 鼠標模擬技術 幾乎所有的游戲中都使用了鼠標來改變角色的位置和方向,玩家僅用…

算法(13)-leetcode-explore-learn-數據結構-鏈表小結

leetcode-explore-learn-數據結構-鏈表51.小結2.例題2.1合并兩個有序鏈表思路1:迭代思路2:遞歸2.2 兩數相加2.3 扁平化多級雙向鏈表2.4 復制帶隨機指針的鏈表2.5 旋轉鏈表本系列博文為leetcode-explore-learn子欄目學習筆記,如有不詳之處,請參考leetcode…

leetcode121買賣股票的最佳時機

給定一個數組,它的第 i 個元素是一支給定股票第 i 天的價格。 如果你最多只允許完成一筆交易(即買入和賣出一支股票),設計一個算法來計算你所能獲取的最大利潤。 注意你不能在買入股票前賣出股票。 示例 1: 輸入: [7,1,5,3,6,…

epoll的內核實現

epoll是由一組系統調用組成。 int epoll_create(int size); int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); int epoll_wait(int epfd, struct epoll_event *events,int maxevents, int timeout); select/poll的缺點在于&#xff1…

算法(14)-數據結構-二叉樹

leetcode-explore-learn-數據結構-二叉樹10.概述1.深度優先遍歷dfs1.1先序遍歷-中左右1.2中序遍歷-左中右1.3后序遍歷-左右中2.廣度優先遍歷bfs3.遍歷-常見問題3.1 二叉樹的最大深度自頂向下自底向上3.2對稱二叉樹3.3路徑總和4.重構-常見問題4.1根據中序和后序遍歷序列構造二叉…

多進程魚多線程的權衡選擇

最近有好多人在網上問道做游戲開發框架用多線程還是多進程呢,或者兩者之間的優缺點,等等類似的問題。下邊小高就帶您小小分析一下: 1、首先要明確進程和線程的含義:進程(Process)是具有一定獨立功能的程序關于某個數據集合上的一次運行活動,是系統進行資源分配和調度的一…

leetcode322 零錢兌換

給定不同面額的硬幣 coins 和一個總金額 amount。編寫一個函數來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 -1。 示例 1: 輸入: coins [1, 2, 5], amount 11 輸出: 3 解釋: 11 5 5 1 示例 2: 輸入: coins [2],…

給數據減肥 讓MySQL數據庫跑的更快

在數據庫優化工作中,使數據盡可能的小,使表在硬盤上占據的空間盡可能的小,這是最常用、也是最有效的手段之一。因為縮小數據,相對來說可以提高硬盤的讀寫速度,并且在查詢過程中小表的內容處理時所占用的系統資源比較少…

算法(15)-leetcode-explore-learn-數據結構-運用遞歸解決二叉樹的問題

leetcode-explore-learn-數據結構-二叉樹2本系列博文為leetcode-explore-learn子欄目學習筆記,如有不詳之處,請參考leetcode官網:https://leetcode-cn.com/explore/learn/card/data-structure-binary-tree/2/traverse-a-tree/7/

leetcode538 把二叉搜索樹轉換成累加樹

給定一個二叉搜索樹(Binary Search Tree),把它轉換成為累加樹(Greater Tree),使得每個節點的值是原來的節點值加上所有大于它的節點值之和。 對于每一個點來說,自己的父,和自己父的右子樹都是大…

AWK常用命令華(1)

awk 調用: 1.調用awk:

AWk的調用精華

awk 的調用方式 awk 提供了適應多種需要的不同解決方案,它們是: 一、awk 命令行,你可以象使用普通UNIX 命令一樣使用awk,在命令行中你也可以使用awk 程序設計語言,雖然awk 支持多行的錄入,但是錄入長長的命令行并保證其正 確無誤卻是一件令人頭疼的事,因此,這種方法一般…

算法(16)-leetcode-explore-learn-數據結構-二叉樹總結

leetcode-explore-learn-數據結構-二叉樹3本系列博文為leetcode-explore-learn子欄目學習筆記,如有不詳之處,請參考leetcode官網:https://leetcode-cn.com/explore/learn/card/data-structure-binary-tree/2/traverse-a-tree/7/所有例題的編程…