xLua在2017年初第一次把“熱補丁”這個概念引入到Unity,一直都爭議不斷挣磨,有人認(rèn)為“功德無量”豪直,也有人認(rèn)為“沒啥價值”劣摇,這兩個極端至今存在。甚至作者本人弓乙,也只是覺得會對游戲有幫助末融,但具體能有多大幫助也沒底。而最近的一個用戶調(diào)查卻發(fā)現(xiàn)唆貌,可能連作者本人都低估了這項技術(shù)的價值滑潘。
(注:這里說的“熱補丁”特指的是運行時用lua函數(shù)替換c#函數(shù)的功能)
熱補丁用戶調(diào)查
我們調(diào)查了8個游戲:
其中3個上過全球收入季度榜前十,1個是多端(手機+PC)同發(fā)锨咙,裝機量3億+,4個是中小型公司的作品追逮。
游戲品類覆蓋了橫版過關(guān)酪刀、競速粹舵、FPS、棋牌骂倘、mmorpg眼滤、卡牌rpg
其中5個純用熱補丁,3個既用了熱補丁历涝,也用了傳統(tǒng)的lua更新
調(diào)查結(jié)果總結(jié):
1诅需、注入代碼不會帶來可以察覺的性能下降,包括對性能敏感的競速和FPS游戲荧库。
2堰塌、只要配置了注入的類型,且在加載補丁后運行的代碼分衫,都能修復(fù)场刑。
3、純用熱補厄秸健:一個月修復(fù)10~30個C# bug不等牵现。混合使用:其中一個幾乎純用lua實現(xiàn)的游戲一個版本偶爾修復(fù)一個C# bug邀桑,其它兩個的2~3個瞎疼。
4、改進意見:代碼段大小壁畸,泛型使用丑慎,大函數(shù)修復(fù)的工作量。
超乎預(yù)料的修復(fù)能力
只要注入了瓤摧,運行時機在補丁加載之后的代碼竿裂,都能修復(fù)!
由于補丁里頭能訪問照弥、調(diào)用到任意的C#代碼腻异,所以理論上不考慮性能的話,配置了注入的代碼都能被修復(fù)这揣。
問題是邏輯轉(zhuǎn)到腳本上執(zhí)行悔常,腳本肯定比原生要慢,如果腳本執(zhí)行過程中要調(diào)用到C#就更慢了给赞。那會不會有某段性能要求很高的代碼机打,轉(zhuǎn)到腳本執(zhí)行后性能完全不能接受呢?
這種情況理論上完全可能的片迅,但被調(diào)查的幾個項目為啥沒出現(xiàn)這種情況呢残邀?
因為性能要求高代表了:1、這段代碼會被頻繁調(diào)用(換句話說會被頻繁測試到);2芥挣、開發(fā)人員也會特別用心去寫驱闷,自測試一般也到位些;3空免、測試人員也會額外留意點空另;4、通常這類代碼在一個項目占比也不多蹋砚。
因此反而這些地方出現(xiàn)bug的概率比較低扼菠。可能被調(diào)查的項目運作都比較規(guī)范坝咐,至少保證重點保障的地方測試到了循榆,因而沒出現(xiàn)因為性能而不能修復(fù)的情況。
代碼段攻略
由調(diào)查可知畅厢,熱補丁技術(shù)使用的最大代價就是代碼段了冯痢。
一方面,xLua持續(xù)的在優(yōu)化代碼段框杜,也提供了各種各樣的注入選項浦楣,能設(shè)定不同的注入模式以及過濾掉一些函數(shù)。合理的選擇選項是可以把影響控制到“被注入代碼”的10%以內(nèi)的咪辱。
而“被注入代碼”振劳,隨著版本的迭代,可以把一些經(jīng)過幾個版本沉淀已經(jīng)穩(wěn)定下來的代碼排除掉油狂。當(dāng)然历恐,初次上線是可以選擇全注入的。
泛型增強
項目反饋說在補丁里頭使用泛型比較麻煩专筷。于是乎xLua為此做了一大波更新弱贼,現(xiàn)在泛型使用更直觀,方便磷蛹,強大了吮旅。詳情可以參見相關(guān)文檔。
下一代熱補丁方案:iFix
改進意見里有點是關(guān)于大函數(shù)修復(fù)的工作量的味咳,對于一些影響不大的bug庇勃,有些項目會因為這個而選擇不修復(fù)。
iFix項目正是為了解決這問題而立項的槽驶,它更易用:直接原工程上改好bug责嚷,配置哪些函數(shù)要做成補丁即可。
熱補丁掂铐,你值得擁有
對于已經(jīng)用C#寫好的項目罕拂,使用熱補丁性價比非常高揍异,低成本:原代碼邏輯不需要做任何調(diào)整,只需要幾行初始化代碼聂受,一些配置蒿秦。高收益:能解決一些線上緊急bug烤镐。
低成本同時意味著可進可退:隨時可以選擇去掉蛋济,真正后顧無憂。
對于希望混合編程的項目炮叶,使用xLua意味著C#的bug也不是完全無能為力了碗旅。
全部用lua來寫的游戲倒沒熱補丁的需求。但全lua感覺只適合卡牌镜悉,休閑類這些對性能要求不高的游戲祟辟。性能要求高的游戲用純C#、混合的居多侣肄,甚至有些項目對于一些要求高的地方旧困,C#都無法滿足需求,得用C++稼锅。
純lua還有其它困境:比如最近純lua游戲容易出現(xiàn)機審不過的情況吼具;大量的lua在后期維護也是個問題等等。
常見誤解
一些常見的誤解矩距,這些誤解是很多人接納熱補丁技術(shù)的坎拗盒。
1、“打補丁”要把C#翻譯成lua锥债,后面更新大版本又要把lua翻譯成C#陡蝇。
對于這種觀點,我想說三點:“哮肚。登夫。≡侍耍”恼策,拋開熱補丁不說,用C#開發(fā)的項目拼窥,出bug也要在C#上修復(fù)吧戏蔑?有了xLua熱補丁,只是增加了能通過lua對線上緊急問題修復(fù)的能力鲁纠,線上緊急問題輕則影響了口碑总棵,重則可能導(dǎo)致一個游戲的沒落(參見某陽師),這重要性不言而喻改含。
2情龄、我不知道哪出bug,怎么知道哪些類要打Hotfix標(biāo)簽?zāi)兀?/p>
前面的調(diào)查我們知道,使用熱補丁的唯一代價就是代碼段增加骤视,這個增加是正比于你配置了Hotfix的類的個數(shù)的鞍爱。所以xLua提供的是白名單機制,讓你去配置专酗。
當(dāng)你實在沒底的話睹逃,可以選擇把所有類都配置到Hotfix,比如剛上線的項目往往選擇這種祷肯。
有人會問抵屿,全加上之拨,一個個類的打標(biāo)簽不是瘋了键耕?
一個個類的打標(biāo)簽枫振?不存在的,xLua的動態(tài)配置可以讓你幾行代碼實現(xiàn)全部業(yè)務(wù)代碼加到Hotfix列表:
[Hotfix]public static List<Type> by_property{
? ?get
? ?{
? ? ? ?return (from type in Assembly.Load("Assembly-CSharp").GetTypes() select type).ToList();
? ?}}
有人會問蒋纬,為啥不默認(rèn)全加上呢猎荠?既然全加上只是幾行代碼的事情,為啥要整成默認(rèn)蜀备,剝奪大家的選擇權(quán)呢关摇?
動態(tài)配置可以加些條件,比如只允許某名字空間琼掠,某個代碼目錄拒垃,排除某些自定類型等等。
總結(jié)
在邏輯更新領(lǐng)域中瓷蛙,bug修復(fù)時效性要求最高悼瓮,而熱補丁技術(shù)恰恰能低成本提供的bug修復(fù)能力,如果你能接受這成本(主要是代碼段增大)艰猬,實在不應(yīng)該有拒絕這項技術(shù)的理由横堡。