使用Go 語言開發(fā)大型 MMORPG 游戲伺服器怎么樣
十多年的玉樹網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。成都全網(wǎng)營銷的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整玉樹建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)從事“玉樹網(wǎng)站設(shè)計”,“玉樹網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。
如果是大型網(wǎng)路游戲的話,我覺得是不合適的。現(xiàn)階段go語言的執(zhí)行效率還是太低了。在底層編譯器的優(yōu)化方面做得和c++相比還是差了不少。go語言也是比較適合快速開發(fā)的專案比較合適
從2013年起,經(jīng)朋友推薦開始用Golang編寫游戲登陸伺服器, 配合C++做第三方平臺驗證. 到編寫?yīng)毩⒐ぞ邔?dǎo)表工具GitHub - davyxu/tabtoy: 跨平臺的高效能便捷電子表格匯出器. 以及網(wǎng)路庫GitHub - davyxu/cell: 簡單,方便,高效的Go語言的游戲伺服器底層. 最終使用這些工具及庫編寫整個游戲伺服器框架, 我的感受是很不錯的
細節(jié)看來, 有如下的幾個點:
語言, 庫
Golang語言特性和C很像, 簡單, 一張A4紙就能寫完所有特性. 你想想看, C++到了領(lǐng)悟階段, 也只用那幾個簡單特性, 剩下的都是一大堆解決各種記憶體問題的技巧. 而Golang一開始就簡單, 何必浪費生命去研究那一大堆的奇技淫巧呢?
Golang的坑只有2個:1. interface{}和nil配合使用, 2. for回圈時, 將回圈變數(shù)引入閉包(Golang, Lua, C#閉包變數(shù)捕獲差異) 完全不影響正常使用, 復(fù)合語言概念, 只是看官方后面怎么有效的避免
用Golang就忘記繼承那套東西, 用組合+介面
用Golang伺服器如何保證解決游戲伺服器存檔一致性問題? s the world是肯定的, 但是Golang可以從語言層并發(fā)序列化玩家資料, 再通過后臺存檔
channel是goroutine雖然是Golang的語言特性. 但是在編寫伺服器時, 其實只有底層用的比較多.
Golang的第三方庫簡直多如牛毛, 好的也很多
不要說模板了, C#的也不好用, 官方在糾結(jié)也不要加, 使用中, 沒模板確實有點不方便. 用interface{}/反射做泛型對于Golang這種強型別語言來說,還是有點打臉
執(zhí)行期
Golang和C++比效能的話, 這是C++的優(yōu)勢, Golang因為沒虛擬機器, 只有薄薄的一層排程層. 因此效能是非常高的, 用一點效能犧牲換開發(fā)效率, 妥妥的
1.6版后的GC優(yōu)化的已經(jīng)很好了, 如果你不是高效能,高并發(fā)Web應(yīng)用, 非要找出一堆的優(yōu)化技巧的話. 只用Golang寫點游戲伺服器, 那點GC損耗可以忽略不計
和其他現(xiàn)代語言一樣, 崩潰捕捉是標配功能, 我用Golang的伺服器線上跑, 基本沒碰到過崩潰情況
熱更新: 官方已經(jīng)有plugin系統(tǒng)的提交, 跨平臺的. 估計很快就可以告別手動cgo做so熱更新
開發(fā), 除錯, 部署, 優(yōu)化
LiteIDE是我首選的Golang的IDE, 雖然有童鞋說B格不高. 但這估計實在是找不到缺點說了, 別跟我說Visual Studio, 那是宇宙級的...
曾經(jīng)聽說有人不看好Golang, 我問為啥: 說這么新的語言, 不好招人,后面打聽到他是個策劃... 好吧
真實情況是這樣的: Golang對于有點程式設(shè)計基礎(chǔ)的新人來說, 1周左右可以開始貢獻程式碼. 老司機2~3天.
開發(fā)效率還是不錯的, 一般大的游戲功能, 2*2人一周3~4個整完. 這換C++時代, 大概也就1~2個還寫不完. 對接伺服器sdk的話, 大概1天接個10多個沒問題
Golang自帶效能調(diào)優(yōu)工具, 從記憶體, CPU, 阻塞點等幾個方面直接出圖進行分析, 非常直觀, 可以參考我部落格幾年前的分析: 使用Golang進行效能分析(Profiling)
Golang支 *** 叉編譯, 跨平臺部署, 什么概念? linux是吧? 不問你什么版本, 直接windows上編譯輸出一個elf, 甩到伺服器上開跑.不超過1分鐘時間..
1.為什么golang的開發(fā)效率高?
golang是一編譯型的強型別語言,它在開發(fā)上的高效率主要來自于后發(fā)優(yōu)勢,不用考慮舊有惡心的歷史,又有一個較高的工程視角。良好的避免了程式設(shè)計師因為“ { 需不需要獨占一行 ”這種革命問題打架,也解決了一部分趁編譯時間找產(chǎn)品妹妹搭訕的階級敵人。
它有自己的包管理機制,工具鏈成熟,從開發(fā)、除錯到釋出都很簡單方便;
有反向介面、defer、coroutine等大量的syntactic sugar;
編譯速度快,因為是強型別語言又有g(shù)c,只要通過編譯,非業(yè)務(wù)毛病就很少了;
它在語法級別上支援了goroutine,這是大家說到最多的內(nèi)容,這里重點提一下。首先,coroutine并不稀罕,語言并不能超越硬體、作業(yè)系統(tǒng)實現(xiàn)神乎其神的功能。golang可以做到事情,其他語言也可以做到,譬如c++,在boost庫里面自己就有的coroutine實現(xiàn)(當然用起來跟其他boost庫一樣惡心)。golang做的事情,是把這一套東西的使用過程簡化了,并且提供了一套channel的通訊模式,使得程式設(shè)計師可以忽略諸如死鎖等問題。
goroutine的目的是描述并發(fā)程式設(shè)計模型。并發(fā)與并行不同,它并不需要多核的硬體支援,它不是一種物理執(zhí)行狀態(tài),而是一種程式邏輯流程。它的主要目的不是利用多核提高執(zhí)行效率,而是提供一種更容易理解、不容易出錯的語言來描述問題。
實際上golang預(yù)設(shè)就是執(zhí)行在單OS程序上面的,通過指定環(huán)境變數(shù)GOMAXPROCS才能轉(zhuǎn)身跑在多OS程序上面。有人提到了網(wǎng)易的pomelo,開源本來是一件很不錯的事情,但是基于自己對callback hell的偏見,我一直持有這種態(tài)度:敢用nodejs寫大規(guī)模游戲伺服器的人,都是真正的勇士 : ) 。
2、Erlang與Golang的coroutine有啥區(qū)別,coroutine是啥?
coroutine本質(zhì)上是語言開發(fā)者自己實現(xiàn)的、處于user space內(nèi)的執(zhí)行緒,無論是erlang、還是golang都是這樣。需要解決沒有時鐘中斷;碰著阻塞式i\o,整個程序都會被作業(yè)系統(tǒng)主動掛起;需要自己擁有排程控制能力(放在并行環(huán)境下面還是挺麻煩的一件事)等等問題。那為啥要廢老大的勁自己做一套執(zhí)行緒放user space里面呢?
并發(fā)是伺服器語言必須要解決的問題;
system space的程序還有執(zhí)行緒排程都太慢了、占用的空間也太大了。
把執(zhí)行緒放到user space的可以避免了陷入system call進行上下文切換以及高速緩沖更新,執(zhí)行緒本身以及切換等操作可以做得非常的輕量。這也就是golang這類語言反復(fù)提及的超高并發(fā)能力,分分鐘給你開上幾千個執(zhí)行緒不費力。
不同的是,golang的并發(fā)排程在i/o等易發(fā)阻塞的時候才會發(fā)生,一般是內(nèi)封在庫函式內(nèi);erlang則更夸張,對每個coroutine維持一個計數(shù)器,常用語句都會導(dǎo)致這個計數(shù)器進行reduction,一旦到點,立即切換排程函式。
中斷介入程度的不同,導(dǎo)致erlang看上去擁有了preemptive scheduling的能力,而golang則是cooperative shceduling的。golang一旦寫出純計算死回圈,程序內(nèi)所有會話必死無疑;要有大計算量少i\o的函式還得自己主動叫runtime.Sched()來進行排程切換。
3、golang的執(zhí)行效率怎么樣?
我是相當反感所謂的ping\pong式benchmark,執(zhí)行效率需要放到具體的工作環(huán)境下面考慮。
首先,它再快也是快不過c的,畢竟底下做了那么多工作,又有排程,又有g(shù)c什么的。那為什么在那些benchmark里面,golang、nodejs、erlang的響應(yīng)效率看上去那么優(yōu)秀呢,響應(yīng)快,并發(fā)強?并發(fā)能力強的原因上面已經(jīng)提到了,響應(yīng)快是因為大量非阻塞式i\o操作出現(xiàn)的原因。這一點c也可以做到,并且能力更強,但是得多寫不少優(yōu)質(zhì)程式碼。
然后,針對游戲伺服器這種高實時性的執(zhí)行環(huán)境,GC所造成的跳幀問題確實比較麻煩,前面的大神 @達達 有比較詳細的論述和緩解方案,就不累述了 。隨著golang的持續(xù)開發(fā),相信應(yīng)該會有非常大的改進。一是遮蔽記憶體操作是現(xiàn)代語言的大勢所趨,它肯定是需要被實現(xiàn)的;二是GC演算法已經(jīng)相當?shù)某墒?,效率勉勉強強過得去;三是可以通過incremental的操作來均攤cpu消耗。
用這一點點效率損失換取一個更高的生產(chǎn)能力是不是值得呢?我覺得是值得的,硬體已經(jīng)很便宜了,人生苦短,讓自己的生活更輕松一點吧: )。
4、基于以上的論述,我認為采用go進行小范圍的MMORPG開發(fā)是可行的。
如果跟C語言比,大部分指令碼都勝出啊。Go, Node.js, Python ......
網(wǎng)易弄過一個Node.js的開源伺服器框架。
至于IDE, 不重要,做伺服器開發(fā)很少會要開著IDE除錯的。最常用的手段就是打Log. 設(shè)定了斷點也很難調(diào),多個客戶端并發(fā)。
那種單客戶端連線進來就可以重現(xiàn)的bug倒是可以用IDE調(diào),但是這種bug本來就容易解決。
用指令碼語言,有一個很大的好處是容易做自動測試,可以更好地保證程式碼質(zhì)量。
--------------------------
開發(fā)效率當然是指令碼高。執(zhí)行效率,其實更重要的是并發(fā),框架合理的話增加機器就可以直接提高效率增加人數(shù)。
用Go開發(fā)大型mmorpg服務(wù)端不會有問題的,如果掉坑里肯定不會是語言的問題。
唯一比較可能掉進去的坑就只有GC,其實很容易預(yù)防和調(diào)整的,具體細節(jié)可以看我部落格分享的文章。
但是技術(shù)選型不只是選語言,如果當時我手頭有一套效能滿意,開發(fā)效率OK,人員補給不會有問題的技術(shù)方案,不管是什么語言的,我肯定不會放棄它而選擇冒險的。
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==xinjian)
{
text.setText("");
}
if(e.getSource()==dakai)
{
openFD.show();
String s;
應(yīng)用于搭建 Web 服務(wù)器,存儲集群或類似用途的巨型中央服務(wù)器的系統(tǒng)編程語言。
Go 是谷歌的編程語言,而不是社區(qū)的。在這位博主看來,雖然 Go 語言擁有一個貢獻者社區(qū),但是它并不是社區(qū)的項目,只是谷歌的一個項目。所以只要是谷歌反對的東西,沒有人可以把這個東西加到 Go 語言中。
InfoQ 記者也第一時間聯(lián)系了《Go 并發(fā)編程實戰(zhàn)》作者、前輕松籌大數(shù)據(jù)負責(zé)人郝林,他的觀點是:Go 語言是大家的,只有偽愛好者才會談舍棄。在郝林看來,Go 語言官方團隊在谷歌內(nèi)部實屬一個很小的團隊,但其成員幾乎個個都是技術(shù)大神。
很多社區(qū)成員為 Go 語言貢獻了很多重要并且有價值的東西,這些從貢獻者和提交者的多樣性就可以看出來。但谷歌作為整個 Go 社區(qū)的守門人,它獨自決定什么東西可以被 Go 語言接受,什么不能被接受。
在 Go 語言模塊系統(tǒng)上發(fā)生的一件事情,谷歌 Go 語言核心團隊的一名成員放棄了由外部 Go 社區(qū)開發(fā)的一個模塊系統(tǒng),因為它使用了另一種不同的模型。Go 語言擁有一個貢獻者社區(qū),但是它并不是一個社區(qū)項目。
Golang游戲開發(fā)是一個非常開放的領(lǐng)域,它可以使用Go語言來開發(fā)游戲,讓開發(fā)者利用Go語言的優(yōu)勢快速開發(fā)游戲。Go語言擁有簡單、可拓展、高效的特點,可以有效地滿足游戲開發(fā)需求。
Go語言提供了一套完整的工具鏈,包括編譯器、調(diào)試器和測試框架,為開發(fā)者提供了強大的開發(fā)支持。此外,Go語言還擁有豐富的標準庫,能夠幫助開發(fā)者編寫游戲的核心邏輯,提高開發(fā)效率。
Go語言還可以使用第三方框架,比如GoLang Game Engine(GLE),可以幫助開發(fā)者快速開發(fā)2D游戲和3D游戲。GLE可以讓開發(fā)者簡單地搭建游戲環(huán)境,提供各種游戲開發(fā)工具,大大提高了游戲開發(fā)效率。
總的來說,Golang游戲開發(fā)是一個非常有前景的領(lǐng)域,它擁有強大的開發(fā)工具和豐富的庫,為開發(fā)者提供了極大的便利性。開發(fā)者可以利用Go語言的優(yōu)勢快速開發(fā)高質(zhì)量的游戲,更好地滿足游戲玩家的需求。
Go 語言是一個試圖結(jié)合動態(tài)類型和靜態(tài)類型,編譯效率和安全性以及語言的易用性等眾多特性與一體的一種嘗試。他的另一個目標是支持現(xiàn)代的基于網(wǎng)絡(luò)的、基于多核的計算。最后,Go 還是非??斓?,他可以在單個計算機上僅僅花費幾秒時間構(gòu)建一個龐大的應(yīng)用程序。使用GO語言開發(fā)android語言步驟如下:
1. 下載安裝Go語言(版本1.5+)
Golang鏈接
回到頂部
2. 下載安裝 gomobile
下載
$ go get golang.org/x/mobile/cmd/gomobile
安裝(需要等待幾分鐘)
gomobile init
回到頂部
3. Golang開發(fā)手機應(yīng)用有兩種方式
a. 原生應(yīng)用開發(fā)
$ go get -d golang.org/x/mobile/example/basic
主要應(yīng)用領(lǐng)域:
應(yīng)用控制管理與配置
OpenGL ES 2 綁定
Asset 管理
Event 管理
試驗中的包,含有OpenAL 綁定、音頻、字體、圖形以及運動傳感器
Android開發(fā)
$ gomobile build -target=android golang.org/x/mobile/example/basic
此命令會生成名為basic的apk安裝包
$ gomobile install golang.org/x/mobile/example/basic
此命令將安裝apk包到已連接的android設(shè)備