工作后好久沒上博客園了,雖然不是很忙,但也沒學生時代閑了。今天上博客園,發(fā)現(xiàn)好多的文章都是年終總結(jié),想想是不是自己也應該總結(jié)下,不過現(xiàn)在還沒想好,等想好了再寫吧。今天寫寫自己在工作后用到的技術(shù)干貨,爭取以后多上博客園寫寫總結(jié)吧,真是懷念學生時代?。。。?/p>
背景
項目組開發(fā)的游戲客戶端使用的腳本是python,服務(wù)器也是python。之所以選擇python,主要還是基于開發(fā)效率的考慮,畢竟這是腳本語言天生的優(yōu)勢;其次就是有很多庫,不用自己再造輪子了??赡苁褂眠^python的同學都會認為python比較耗,運行效率不高,一個簡單的賦值語句就包含了多個對象的生成和釋放。但其實現(xiàn)在服務(wù)器的性能非常好,通常性能都是過剩的,所以python在服務(wù)器上高效地跑是完全沒問題的;至于客戶端,性能的瓶頸主要還是在引擎層,在一幀中最多也就20%的時間在執(zhí)行腳本,超過太多說明邏輯寫的有問題或者可以分攤到多幀去執(zhí)行。本文主要介紹下在使用python腳本的情況下解決線上問題的幾種有效技術(shù),其它語言應該也有類似的技術(shù),特別是腳本語言,這里只是做個拋磚引玉~~
熱更新(hotfix)
這種技術(shù)主要是針對情況比較緊急,并且bug是腳本邏輯錯誤導致的。如客戶端邏輯寫的有問題導致出現(xiàn)exception,使得玩家某個玩法不能玩,或者是服務(wù)端某個代碼邏輯寫的有問題。這種技術(shù)實現(xiàn)的主要思路是(以熱更新客戶端為例):服務(wù)器將修正的代碼發(fā)送到客戶端,客戶端動態(tài)執(zhí)行這段代碼來修復bug。用python來實現(xiàn)這個其實非常簡單,只需要在客戶端內(nèi)嵌的python虛擬機中動態(tài)編譯服務(wù)端發(fā)過來的代碼,并執(zhí)行這段代碼就行了。例如:現(xiàn)在客戶端有下面一段的代碼,這段代碼是有錯誤的。
1 #模塊test2 3 def not_has_a(x):4 return hasattr(x, 'a')
本來上面代碼是希望x對象沒有a屬性后返回True,但現(xiàn)在情況正好反過來了。現(xiàn)在我們需要寫一段代碼來修正這個問題,也就是寫一段代碼給python虛擬機執(zhí)行,動態(tài)修改test模塊中not_has_a函數(shù)的定義。這個在python中很好實現(xiàn)的,因為python中函數(shù)也是一個對象,模塊中只是根據(jù)函數(shù)名來索引對應的函數(shù)對象的,所以我們只需要重新定義一個新的not_has_a函數(shù)對象,將模塊中根據(jù)not_has_a函數(shù)名索引的對象指向新定義的函數(shù)對象就行。具體代碼如下:
網(wǎng)友評論