node.js適合游戲后臺開發(fā)嗎?
網(wǎng)站服務(wù)器和游戲服務(wù)器是怎么樣聯(lián)系到一起的?
1. 游戲分很多種,咱們先來看看MMORPG。
再怎么簡單的RPG服務(wù)器都免不了處理多人交互的情形,上百人在同一個場景里面,每個客戶端都需要收到其他所有人的操作信息。
其次,用戶的操作是非常頻繁的,一般的服務(wù)器傾向于持有長連接。而且這些鏈接的是頻繁交互的,沒有明顯的持久的分區(qū)策略,所以限制了服務(wù)器的橫向擴(kuò)展,同一個場景往往只能放在一個物理機(jī)上面運(yùn)行。
再次,端游通常是不敢把邏輯運(yùn)算放客戶端的,用戶分分鐘給你破解掉,改改金幣,刷兩件裝備再常見不過了。所以這一臺地圖服務(wù)器得驗證地圖內(nèi)所有玩家的操作,并計算怪物AI、掉率等一系列業(yè)務(wù)邏輯。
我們可以看到,傳統(tǒng)游戲服務(wù)器與網(wǎng)頁服務(wù)器具有明顯的區(qū)別,具有長連接、多廣播、有復(fù)雜的業(yè)務(wù)邏輯、分區(qū)策略受限等獨(dú)特的業(yè)務(wù)需求。
2. 咱們在來看看并發(fā)帶給游戲服務(wù)器的好處是什么。
并發(fā)實(shí)際上是一種程序邏輯流程,他是不需要多核物理支持的。大致意思就是讓多個獨(dú)立的邏輯流看上去像是在同時跑一樣。操作系統(tǒng)級別的并發(fā)就是多進(jìn)程多線程模型。讓OS處理時鐘中斷,i\o阻塞等等問題。
對于 服務(wù)器 而言,如果任務(wù)大部分的時間耗在i\o上,有了并發(fā)機(jī)制可以避免整個地圖服務(wù)被i\o訪問阻塞。一個任務(wù)阻塞的時候,把空余計算資源分配到其他任務(wù)上去。在這種情況下,并發(fā)是有益于服務(wù)器運(yùn)行效率還有響應(yīng)時間的。
對于程序員而言,獨(dú)立的邏輯流意味著可以在一個可靠、簡單、松耦合的上下文環(huán)境里面,完成自己的任務(wù)。
因為讓OS處理程序邏輯切換得反復(fù)陷入內(nèi)核,有的人覺得這樣太慢,做了一些處于user space的線程,進(jìn)程內(nèi)自己控制多個邏輯流。因為語言描述能力的限制,在C/C++上面寫還有用這種東西都太麻煩。于是產(chǎn)生了erlang, go, lua里面的coroutine語法糖。
node.js本質(zhì)上也是自己控制多個邏輯流,但是這個邏輯流是根據(jù)i\o狀態(tài)還有優(yōu)先級分發(fā)的。在實(shí)際的實(shí)現(xiàn)中,它盡量采用非阻塞異步i\o,單個任務(wù)調(diào)用i\o的時候,我就停掉它,等i\o完成的信號發(fā)上來了,我再重啟它。
注意這一點(diǎn),每次我會運(yùn)行一個任務(wù),直到它完成或者是發(fā)生i\o調(diào)用都不會主動切換至其他的程序流。那么如果這一個任務(wù)里面涉及過于大量的計算,那么整個地圖進(jìn)程都會被block在這里。
而正因為node.js是異步的,所以需要不斷的寫回調(diào)監(jiān)聽i\o完成的信號。單個任務(wù)的邏輯流會多次的被打斷。當(dāng)任務(wù)變得相當(dāng)復(fù)雜的時候,即有所謂的callbak hell,會帶給調(diào)試開發(fā)非常大的麻煩。
3. 因為上面的原因,所以我不建議在非原型的MMORPG服務(wù)器開發(fā)中使用node.js。
4.最近興起的手游服務(wù)器倒是挺適合node.js,因為手游這玩意局限于網(wǎng)絡(luò)問題,服務(wù)器只能做關(guān)鍵數(shù)據(jù)驗證,也沒辦法處理特別多人交互的情形。服務(wù)器端已經(jīng)簡化得跟網(wǎng)頁服務(wù)器沒啥區(qū)別了,業(yè)務(wù)邏輯也簡單,處理處理數(shù)據(jù),然后持久化就成。
相關(guān)文章
一文詳解Node中module.exports和exports區(qū)別
這篇文章主要介紹了一文詳解Node中module.exports和exports區(qū)別2023-03-03
node文件資源管理器讀取視頻信息從零實(shí)現(xiàn)
這篇文章主要為大家介紹了node文件資源管理器讀取視頻信息從零實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
windows如何把已安裝的nodejs高版本降級為低版本(圖文教程)
這篇文章主要介紹了windows如何把已安裝的nodejs高版本降級為低版本,本文分步驟通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12
手把手教你把nodejs部署到linux上跑出hello world
本篇文章主要介紹了手把手教你把nodejs部署到linux上跑出hello world,非常具有實(shí)用價值,需要的朋友可以參考下2017-06-06
使用upstart把nodejs應(yīng)用封裝為系統(tǒng)服務(wù)實(shí)例
這篇文章主要介紹了使用upstart把nodejs應(yīng)用封裝為系統(tǒng)服務(wù)實(shí)例,需要的朋友可以參考下2014-06-06
使用Node.js配合Nginx實(shí)現(xiàn)高負(fù)載網(wǎng)絡(luò)
這篇文章主要介紹了使用Node.js配合Nginx實(shí)現(xiàn)高負(fù)載網(wǎng)絡(luò),Node的異步加上Nginx的反向代理在性能上實(shí)在是給力!需要的朋友可以參考下2015-06-06

