工作后好久沒上博客園了,雖然不是很忙,但也沒學(xué)生時(shí)代閑了。今天上博客園,發(fā)現(xiàn)好多的文章都是年終總結(jié),想想是不是自己也應(yīng)該總結(jié)下,不過現(xiàn)在還沒想好,等想好了再寫吧。今天寫寫自己在工作后用到的技術(shù)干貨,爭(zhēng)取以后多上博客園寫寫總結(jié)吧,真是懷念學(xué)生時(shí)代?。。?!
背景
項(xiàng)目組開發(fā)的游戲客戶端使用的腳本是python,服務(wù)器也是python。之所以選擇python,主要還是基于開發(fā)效率的考慮,畢竟這是腳本語言天生的優(yōu)勢(shì);其次就是有很多庫(kù),不用自己再造輪子了。可能使用過python的同學(xué)都會(huì)認(rèn)為python比較耗,運(yùn)行效率不高,一個(gè)簡(jiǎn)單的賦值語句就包含了多個(gè)對(duì)象的生成和釋放。但其實(shí)現(xiàn)在服務(wù)器的性能非常好,通常性能都是過剩的,所以python在服務(wù)器上高效地跑是完全沒問題的;至于客戶端,性能的瓶頸主要還是在引擎層,在一幀中最多也就20%的時(shí)間在執(zhí)行腳本,超過太多說明邏輯寫的有問題或者可以分?jǐn)偟蕉鄮?zhí)行。本文主要介紹下在使用python腳本的情況下解決線上問題的幾種有效技術(shù),其它語言應(yīng)該也有類似的技術(shù),特別是腳本語言,這里只是做個(gè)拋磚引玉~~
熱更新(hotfix)
這種技術(shù)主要是針對(duì)情況比較緊急,并且bug是腳本邏輯錯(cuò)誤導(dǎo)致的。如客戶端邏輯寫的有問題導(dǎo)致出現(xiàn)exception,使得玩家某個(gè)玩法不能玩,或者是服務(wù)端某個(gè)代碼邏輯寫的有問題。這種技術(shù)實(shí)現(xiàn)的主要思路是(以熱更新客戶端為例):服務(wù)器將修正的代碼發(fā)送到客戶端,客戶端動(dòng)態(tài)執(zhí)行這段代碼來修復(fù)bug。用python來實(shí)現(xiàn)這個(gè)其實(shí)非常簡(jiǎn)單,只需要在客戶端內(nèi)嵌的python虛擬機(jī)中動(dòng)態(tài)編譯服務(wù)端發(fā)過來的代碼,并執(zhí)行這段代碼就行了。例如:現(xiàn)在客戶端有下面一段的代碼,這段代碼是有錯(cuò)誤的。
1 #模塊test2 3 def not_has_a(x):4 return hasattr(x, 'a')
本來上面代碼是希望x對(duì)象沒有a屬性后返回True,但現(xiàn)在情況正好反過來了?,F(xiàn)在我們需要寫一段代碼來修正這個(gè)問題,也就是寫一段代碼給python虛擬機(jī)執(zhí)行,動(dòng)態(tài)修改test模塊中not_has_a函數(shù)的定義。這個(gè)在python中很好實(shí)現(xiàn)的,因?yàn)閜ython中函數(shù)也是一個(gè)對(duì)象,模塊中只是根據(jù)函數(shù)名來索引對(duì)應(yīng)的函數(shù)對(duì)象的,所以我們只需要重新定義一個(gè)新的not_has_a函數(shù)對(duì)象,將模塊中根據(jù)not_has_a函數(shù)名索引的對(duì)象指向新定義的函數(shù)對(duì)象就行。具體代碼如下:
延伸閱讀
- ssh框架 2016-09-30
- 阿里移動(dòng)安全 [無線安全]玩轉(zhuǎn)無線電——不安全的藍(lán)牙鎖 2017-07-26
- 消息隊(duì)列NetMQ 原理分析4-Socket、Session、Option和Pipe 2024-03-26
- Selective Search for Object Recognition 論文筆記【圖片目標(biāo)分割】 2017-07-26
- 詞向量-LRWE模型-更好地識(shí)別反義詞同義詞 2017-07-26
- 從棧不平衡問題 理解 calling convention 2017-07-26
- php imagemagick 處理 圖片剪切、壓縮、合并、插入文本、背景色透明 2017-07-26
- Swift實(shí)現(xiàn)JSON轉(zhuǎn)Model - HandyJSON使用講解 2017-07-26
- 阿里移動(dòng)安全 Android端惡意鎖屏勒索應(yīng)用分析 2017-07-26
- 集合結(jié)合數(shù)據(jù)結(jié)構(gòu)來看看(二) 2017-07-26