导出配置_Lua配置表导出优化
生活随笔
收集整理的這篇文章主要介紹了
导出配置_Lua配置表导出优化
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
隨著游戲的開發(fā),項(xiàng)目的配置表數(shù)據(jù)越來越多,占用的內(nèi)存越來越;配置表占用太大就會(huì)影響游戲加載速度,游戲流暢度的每一毫秒都是我們的必爭(zhēng)之路。
[1] = {DungeonID=10000, Dungeon= "王進(jìn)打高俅", NextDungeonID=10100, BattleID= {10001, }, BattleTime=0, Quality=0, BackMusic= "BGM_Fight", },[2] = {DungeonID=10100, Dungeon= "魯提轄,拳打鎮(zhèn)關(guān)西", NextDungeonID=10200, BattleID= {10101, 10102, }, BattleTime=0, Quality=0, BackMusic= "BGM_Fight", },[3] = {DungeonID=10200, Dungeon= "五臺(tái)山,僧與俗的較量", NextDungeonID=10300, BattleID= {10201, 10202, 10203, 10204, 10205, 10206, 10207, 10208, }, BattleTime=0, Quality=0, BackMusic= "BGM_Fight", },我們項(xiàng)目采用的配置表存儲(chǔ)方式是Lua表格,策劃配表用excel配置,然后使用網(wǎng)上的開源工具excel2lua導(dǎo)出lua表格,業(yè)務(wù)邏輯使用的時(shí)候直接import表就好了。在觀察了導(dǎo)出的lua表格后,我們整理出一堆待優(yōu)化的問題:
1. 沒有意義的空值(比如0,[]等)2. 重復(fù)數(shù)據(jù)
3. 默認(rèn)值
4. 字段名優(yōu)化
5. 客戶端、服務(wù)端表格分離
搞清楚了數(shù)據(jù)冗余的原因,我們就可以制定優(yōu)化方案:
沒有意義的空值(比如0,[]等)
空的table:我們建了一張全局表GlobelEmptyTable = {},然后把這些空table都指向這個(gè)GlobelEmptyTable重復(fù)數(shù)據(jù)
對(duì)于重復(fù)數(shù)據(jù),我們?cè)趌ua表新建一張duplication表,用來存放重復(fù)數(shù)據(jù),然后把重復(fù)的數(shù)據(jù),都指向這張表里面相應(yīng)的重復(fù)的數(shù)據(jù)。默認(rèn)值
通過觀察可以發(fā)現(xiàn)其中有部分字段很容易重復(fù),如:BattleTime、Quality等, 這些字段通常為枚舉或者有固定的分類,只有幾個(gè)不同的值,然而配置表中每個(gè)item都需要為這些內(nèi)容創(chuàng)建一個(gè)字段。我們的優(yōu)化方案是,利用lua的特性--原表(metatable),建一張defaultValues表,在導(dǎo)出的時(shí)候,選取出現(xiàn)次數(shù)最多的值作為每個(gè)字段的原表,存到defaultValues,然后剔除每行中與默認(rèn)值相同的字段,從而節(jié)省內(nèi)存。local defaultValues = {Dungeon = "",Describe = "",PlayerLevel = 0,Name = "",NeedStar = 0,BackMusic = "BGM_Fight",PrizeInfo = 0,Crime = "",Num = 1,Place = "",BattleID = gConstEmptyTable,BackGround = "",NextDungeonID = 0,DungeonID = 0,ID = 0, }dolocal base = {__index = defaultValues, --基類,默認(rèn)值存取__newindex = function()--禁止寫入新的鍵值error("Attempt to modify read-only table")end}for k, v in pairs(DUNGEON_LIST) dosetmetatable(v, base)endbase.__metatable = false --不讓外面獲取到元表,防止被無意修改 end
字段名優(yōu)化
熱心網(wǎng)友給我提出這種優(yōu)化,但是這種類似CSV存儲(chǔ)格式,可想而知,內(nèi)存肯定可以降低很多,我簡(jiǎn)單實(shí)現(xiàn)了一下,比對(duì)了一下內(nèi)存,差別還是很大的!!!但是這種存儲(chǔ)格式和默認(rèn)值方案沖突,只能取舍,現(xiàn)在項(xiàng)目已經(jīng)做完了,下個(gè)項(xiàng)目可以試一下這種方案。修改前修改后local KeyMap = {costRes = 1,costTime = 2,troopsCount = 3,power = 4,model = 5, }local BUILD101 = {[1] = {{}, 0, 2, 69, "castle1", },[2] = {{ 1001, 1782, 1002, 2430, 1003, 2430, 1004, 1458, }, 295, 2, 166, "castle1", },[3] = {{ 1001, 2673, 1002, 3645, 1003, 3645, 1004, 2187, }, 1080, 2, 302, "castle1", }, }dolocal base = {__index = function(table,key)local keyIndex = KeyMap[key]if not keyIndex thenprint("key not found: ",key)return nilendreturn table[keyIndex]end, --基類,默認(rèn)值存取__newindex = function()--禁止寫入新的鍵值error("Attempt to modify read-only table")end}for k, v in pairs(BUILD101) dosetmetatable(v, base)endbase.__metatable = false --不讓外面獲取到元表,防止被無意修改 end客戶端、服務(wù)端表格分離
服務(wù)器對(duì)于這么點(diǎn)內(nèi)存,根本不會(huì)在意,但是客戶端大不一樣,是個(gè)精打細(xì)算的好媳婦,每一KB都要計(jì)較的,所以,我們?cè)O(shè)計(jì)一個(gè)參數(shù)來控制配置表導(dǎo)出對(duì)象,C:客戶端、S:服務(wù)端,在和策劃設(shè)計(jì)表的時(shí)候,告知哪些是客戶端需要的參數(shù),導(dǎo)出的時(shí)候,按C、S導(dǎo)出2張表。本文中使用的配置表優(yōu)化工具源碼已經(jīng)放在github,需要的朋友可以自取:)https://github.com/Aver58/Tools
使用元表優(yōu)化 Lua 配置文件?www.orztu.comLua配置表存儲(chǔ)優(yōu)化方案 - UWA Blog?blog.uwa4d.com總結(jié)
以上是生活随笔為你收集整理的导出配置_Lua配置表导出优化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “云边不可寻”上一句是什么
- 下一篇: 创世神话初始法宝好还是打到的法宝好?