[發(fā)明專利]網(wǎng)絡(luò)游戲服務(wù)器陷入死循環(huán)的處理方法有效
| 申請?zhí)枺?/td> | 201410050333.5 | 申請日: | 2014-02-14 |
| 公開(公告)號: | CN103810053B | 公開(公告)日: | 2017-06-13 |
| 發(fā)明(設(shè)計)人: | 劉德建;陳宏展;郭銳;陳南 | 申請(專利權(quán))人: | 福建天晴數(shù)碼有限公司 |
| 主分類號: | G06F11/07 | 分類號: | G06F11/07 |
| 代理公司: | 福州市鼓樓區(qū)京華專利事務(wù)所(普通合伙)35212 | 代理人: | 宋連梅 |
| 地址: | 350000 福*** | 國省代碼: | 福建;35 |
| 權(quán)利要求書: | 查看更多 | 說明書: | 查看更多 |
| 摘要: | |||
| 搜索關(guān)鍵詞: | 網(wǎng)絡(luò)游戲 服務(wù)器 陷入 循環(huán) 處理 方法 | ||
【技術(shù)領(lǐng)域】
本發(fā)明屬于計算機軟件技術(shù)領(lǐng)域,具體是指一種使用腳本的網(wǎng)絡(luò)游戲服務(wù)器陷入死循環(huán)的處理方法。
【背景技術(shù)】
在軟件架構(gòu)里,很基本的一個模式就是Client/Server模式,Client端用于顯示數(shù)據(jù)和響應(yīng)操作,而Server負責為所有的Client端服務(wù)器:下發(fā)數(shù)據(jù)和響應(yīng)上發(fā)的消息。網(wǎng)絡(luò)游戲的實現(xiàn)也是這樣一種典型的架構(gòu),Client端就是游戲客戶端,玩家在客戶端顯示的虛擬世界里進行游戲,而Server端就是游戲服務(wù)器,負責下發(fā)玩家的信息和同步其它的玩家。
如果游戲服務(wù)器代碼有問題,程序運行過程中出現(xiàn)死循環(huán),那它就再也不能處理客戶端的連接和消息包,所有的客戶端就都不能進行游戲了。這對幾千人、幾萬人在線的游戲來講是致命的。目前游戲行業(yè)的服務(wù)器,都是通過提高代碼質(zhì)量、大量進行測試來防止出現(xiàn)死循環(huán),而一旦出現(xiàn)死循環(huán),就只能重啟服務(wù)器程序了。而維護服務(wù)器的人不可能一天24小時就呆在服務(wù)器旁邊,所以經(jīng)常發(fā)生服務(wù)器出問題后,過了好久才將服務(wù)器重啟的情況。這給游戲的運營,帶來了很不好的影響。
有鑒于此,本發(fā)明人針對現(xiàn)有技術(shù)的缺陷深入研究,遂有本案產(chǎn)生。
【發(fā)明內(nèi)容】
本發(fā)明所要解決的技術(shù)問題在于提供一種穩(wěn)定有效的網(wǎng)絡(luò)游戲服務(wù)器陷入死循環(huán)的處理方法。
本發(fā)明是這樣實現(xiàn)的:
網(wǎng)絡(luò)游戲服務(wù)器陷入死循環(huán)的處理方法,包括如下步驟:
第一步驟:死循環(huán)的檢測:
在主線程處理消息前,將這個消息的唯一id、類型和當前時刻記錄下來,保存在一個可多線程訪問的結(jié)構(gòu)類型的數(shù)據(jù)里,然后調(diào)入到Lua里對這個消息進行處理,處理完后回到C++里時,再將這些信息清空;監(jiān)護線程以固定的頻率來檢測這些信息的處理情況,不同的消息通過消息的唯一id來標識,如果每次檢測時,發(fā)現(xiàn)都是在同一個消息的處理狀態(tài)中,并且處理時間已經(jīng)超過了最大值,那么就判斷陷入了死循環(huán);
第二步驟:死循環(huán)的恢復(fù):
當判定主線程陷入死循環(huán)后,監(jiān)護線程就將主線程掛起,使它暫時停止運行,然后取得Lua實例,就是lua_State對象,然后通過Lua庫的接口,取得當前的運行堆棧,記錄到日志中,方便查出到底是哪里的代碼引起了死循環(huán);然后取得Lua實例中的_G全局變量,將_G這個table中的所有變量和函數(shù),移到另外一個新建的table,清空_G變量里的數(shù)據(jù);然后監(jiān)護線程將主線程設(shè)置為進入“Lua死循環(huán)錯誤狀態(tài)”,然后再恢復(fù)主線程的運行,當主線程里的Lua代碼訪問到_G里的變量或函數(shù),會觸發(fā)Lua錯誤,就會跳回到C++里,主線程就成功地從死循環(huán)中跳出來了;跳回到C++里后,檢測到當前是“Lua死循環(huán)錯誤狀態(tài)”,就將Lua中的_G_BACKUP存儲的變量和函數(shù)取出,設(shè)置回_G全局變量中,就恢復(fù)了Lua的正常運行環(huán)境。
進一步地,所述監(jiān)護線程將Lua實例中的_G變量清空的同時,會記錄下當前處理的消息類型,然后當主線程恢復(fù)到正常運行狀態(tài)時,如果有客戶端又上發(fā)了這個類型的消息,服務(wù)器將會丟棄這個消息而不再處理。
本發(fā)明的優(yōu)點在于:這是一種比較通用的主動使腳本語言觸發(fā)運行錯誤的方法,只要一個腳本語言有一個類似Lua里的_G全局表的變量,就可以使用這種方法。使用這個方法后,服務(wù)器再也沒有發(fā)生過陷入死循環(huán)后,所有玩家都不能進行游戲的事情了,服務(wù)器更加穩(wěn)定,不用擔心服務(wù)器忽然在什么時候又出問題了。
【具體實施方式】
程序一旦陷入死循環(huán),基本上無法恢復(fù),除非重啟進程,特別是像C/C++這樣的中低級語言開發(fā)的程序。游戲服務(wù)器由于邏輯比較復(fù)雜,所以一般會接入腳本進行開發(fā),本發(fā)明項目里使用的就是Lua腳本。除了框架代碼,所有的游戲邏輯功能,都使用Lua語言開發(fā)。Lua這樣的腳本語言有一個特征,就是運行時如果發(fā)生錯誤,會跳到從C/C++調(diào)到Lua的初始地方,而不是像C/C++那樣,遇到運行錯誤程序就直接崩潰退出了。本發(fā)明技術(shù)方案的核心思想,就是在Lua語言程序陷入死循環(huán)后,主動觸發(fā)它的運行時錯誤,讓它中止運行,然后跳回到C/C++里,這樣就從死循環(huán)中解脫出來,然后通過一些后續(xù)處理,來避免再運行相同的代碼,從而避免再次陷入死循環(huán)。
本發(fā)明共涉及到兩個線程,一個線程就是游戲服務(wù)器的主線程,負責處理所有客戶端的消息,另一個線程起監(jiān)視和協(xié)助的作用。
具體實現(xiàn)方式如下:
一、對死循環(huán)的檢測:
該專利技術(shù)資料僅供研究查看技術(shù)是否侵權(quán)等信息,商用須獲得專利權(quán)人授權(quán)。該專利全部權(quán)利屬于福建天晴數(shù)碼有限公司,未經(jīng)福建天晴數(shù)碼有限公司許可,擅自商用是侵權(quán)行為。如果您想購買此專利、獲得商業(yè)授權(quán)和技術(shù)合作,請聯(lián)系【客服】
本文鏈接:http://www.szxzyx.cn/pat/books/201410050333.5/2.html,轉(zhuǎn)載請聲明來源鉆瓜專利網(wǎng)。
- 網(wǎng)絡(luò)游戲方法
- 對網(wǎng)絡(luò)游戲用戶進行時間限制的方法和系統(tǒng)
- 一種啟動網(wǎng)絡(luò)游戲的方法及系統(tǒng)
- 一種同步網(wǎng)絡(luò)游戲時間的方法及裝置
- 一種網(wǎng)絡(luò)游戲資源獲取方法及裝置
- 網(wǎng)絡(luò)游戲的優(yōu)化器、優(yōu)化方法和優(yōu)化系統(tǒng)
- 網(wǎng)絡(luò)游戲中進行分桌處理的方法及網(wǎng)絡(luò)游戲服務(wù)器
- 網(wǎng)絡(luò)游戲加速方法
- 一種確定網(wǎng)絡(luò)游戲中作弊用戶的方法及裝置
- 一種網(wǎng)絡(luò)游戲的優(yōu)化方法、裝置及系統(tǒng)





