日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

导出配置_Lua配置表导出优化

發(fā)布時(shí)間:2023/12/1 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 导出配置_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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。