近兩日極為糾結——遊戲伺服器,選擇何種技術方案?(Python + SWIG–RakNet + Lua)

來源:互聯網
上載者:User
 

近兩日極為糾結——遊戲伺服器,選擇何種技術方案?(Python + SWIG--RakNet + Lua)分類: 想法 編程 python2012-05-10 08:15 1577人閱讀 評論(4) 收藏 舉報python伺服器遊戲luahttp伺服器postgresql

        需求是:一種移動或web遊戲的伺服器,要求是盡量保證維護簡單,架構儘可能簡潔,代碼量不宜過多;考慮1人非全職進行伺服器維護,不應對營運造成太大難度。

        首先,必須使用RakNet,可用的遊戲伺服器架構很稀有,這是其中一個開源架構,底層提供完整的可靠UDP協議,上層有完整的封裝,不得不用。

        其次,用戶端採用C++、Lua編寫,其中邏輯部分完全使用Lua編寫。伺服器需要做一部分驗證工作,所以應當部分複用相關邏輯。

 

        技術實驗結論如下:

        1、利用HTTP伺服器建立遊戲伺服器。非常簡單粗暴的思路,做起來很快,但是在HTTP服務裡伺服器無法主動發出請求,所以某些互動方面的需求幾乎不可實現。經討論放棄。

        2、RakNet完全採用C++編寫,維護難度適中。RakNet的Patcher伺服器官方建議採用PostgreSQL作為資料庫,原因是MySQL的部分功能支援不正常。比如截取資料庫裡超長字串其中的一段會非常的慢。

        3、DB中介軟體(ORM),可選擇範圍:C++庫可選ODB,Python庫可選SQLAlchemy。

        4、介面產生器SWIG。用於將C++的庫(例如RakNet)全部半自動化註冊到其他語言,經實驗難度適中,可行。尚存在問題:回呼函數的註冊,遠端程序呼叫RPC的註冊還沒有調查過。

        5、Python的使用方式有兩種:一是將C++的底層庫完全註冊給Python使用,另一種是讓C++調用Python模組的介面。

        6、Lua的技術實現上預計不存在太大問題。伺服器端邏輯相關代碼基本確定採用Lua編寫。

        7、早上的新發現:Lua與Python混合編程:Lunatic Python。 Being two-way means that it allows Lua inside Python, Python inside Lua, Lua inside Python inside Lua, Python inside Lua inside Python, and so on. 霸氣側漏。不知道你敢不敢用,我反正敢用。另外有Lunatic Python的Lua-jit最佳化版本:lupa。網址分別為:

        http://labix.org/lunatic-python

        http://pypi.python.org/pypi/lupa/0.9

        8、早上的新發現:Cython。支援用一種特製的文法編寫看起來是Python,實際是C的代碼,之後可以將其編譯為C語言層級的動態連結程式庫。在數學運算、函數調用方面極大降低開銷,加快速度。可以用在項目中後期最佳化的時候。特此記錄。

 

        重要優缺點介紹:

        1、C++的ORM庫ODB據百度說是最佳選擇之一,但仔細研究了一整天協助手冊和實際實驗,發現此庫要求使用者使用C++11的新特性,大量使用#pragma等編譯器特殊文法,Table的關聯是用多種不同類型的智能指標實現的。並且此庫底層提供了類似boost的改裝庫,提供了比boost更豐富的智能指標例如lazy_shared_ptr。這些進階功能必然會被使用到。(我很想說:這貨不是C++。)

            此外,由於C++需要被編譯,所以ODB在使用時不是完全自動化的,其使用分解為兩大步:分析標頭檔產生膠水層、然後編譯連結使用者代碼和膠水層。

        2、SQLAlchemy使用上非常簡單,可以通過簡單設計實現資料庫初始化、操作一體化。且本人對Python的瞭解程度遠高於C++11、boost等。其致命缺點在於一旦採用Python相關技術,勢必要在C++/Python介面上下很多功夫。

        3、SWIG的致命問題在於——移植庫的過程是一個考驗C++/其他語言文法基本功的過程,非常有挑戰。實現難度:4星半,但可以一試。

 

        計劃在上述條件下設計伺服器架構,目前剩餘問題是C++如何用簡單的方式調用Python介面。預計今日(2012-5-10)晚得出結論。

 

——————————————————————————————————————————————————————

        結論:完全使用 Python + Lua(Lunatic Python)編寫伺服器

        其中,RakNet庫用SWIG將重要介面全部註冊給Python,直接用Python編寫高效能伺服器!移植時有一些進階特性需要仔細看SWIG的線上文檔,已實驗通過。歡迎交流。

 

        這樣一來,所有技術重點全部轉移到Python上了。希望玩Python愛好者們都看到這篇文章。其實我最近很想學Ruby = =

 

 

分享到: 
  • 上一篇:Simplicity and Compromise
  • 下一篇:非同步(延時)邏輯難題,以及採用lua的解決方案
1
0
查看評論
2樓 mayao11 2012-05-10 18:25發表 [回複] [引用] [舉報]
引用“lanphaday”的評論:

為什麼不用 pure python……我好幾個項目都是 pure python,完全撐得住,包括《天...

python缺少類似RakNet這樣的網路程式庫。底層這塊怎麼做呢?
謝謝指導~

Re: 賴勇浩 2012-05-12 10:28發表 [回複] [引用] [舉報]
回複mayao11:目前我用 gevent+protobuf,實現了一套 rpc。
Re: mayao11 2012-05-14 18:19發表 [回複]
回複lanphaday:百度了下,gevent看起來很好的樣子。protobuf是好東西,不知道雲風寫的那個好不好用,據說很快 : )

恩,這次先繼續Rak了,下次有機會考慮gevent

1樓 賴勇浩 2012-05-10 15:19發表 [回複]
為什麼不用 pure python……我好幾個項目都是 pure python,完全撐得住,包括《天下盛境》這樣的即時動作類遊戲。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.