Lua配置表儲存優化方案

2021-09-22 00:27:26 字數 2729 閱讀 3403

◆◆

簡單介紹

lua作為乙個極為精簡的嵌入型指令碼語言,已經廣泛地用在了遊戲業。lua的存在一般是兩種場合,一種用於實現遊戲上層業務邏輯,一種則利用了lua語言本身靈活簡單的資料表達能力而被廣大程式設計師用於資料的儲存,也就是常說的配置檔案。

一般來說配置檔案的初始**是策劃維護著的、有著一定格式約束的excel**,經由程式設計師提供的匯出工具,把excel的**資料匯出成為遊戲能直接讀取使用的lua原始碼。

這些原始碼檔案以lua table的形式儲存與excel等價的資料,通常可以簡單把這個配置表看成是一組2維陣列,轉換成配置就是乙個key(excel第一列)對應一組子資料(excel中一行),那麼整個配置資料就是乙個大表包含著若干小表,如下:

原始配置表:

轉換成lua後大致是這樣:

local mapsetting = 

, scriptid = {},

...},

[2] = ,

scriptid = ,

...},

[3] = ,

scriptid = {},

...}

...}return mapsetting

如果配置檔案中的資料過大,或著是有冗餘的無用資料,那麼勢必會導致輸出的lua檔案過大,這將嚴重影響載入速度和增大記憶體佔用量。本文將介紹一種消除配置檔案中冗餘資料,達到壓縮和優化資料儲存的方法。

◆◆

優化思路

大量的資料是重複的,或著是代表沒有意義的空值(比如0,等);

大量的中文字串是需要遊戲後期做本地化處理的;

很多複合型資料(子表,陣列)內容是一樣的;

搞清楚了資料冗餘的原因,我們就可以制定優化方案:

對於excel中的一列,出現次數最多的值認定為預設值,然後把它從lua表中剔除掉,然後利用metatable機制實現全域性預設值儲存;

對於中文字串,替換為乙個唯一的id標識,寫回到lua表中,讀取的時候加上相應的查詢替換;

對於一些複雜的子表或著陣列,做唯一化替換處理,替換後寫回到原始資料中;

能看出來,上面的操作其實做的都是唯一化處理,所以有個要求就是整個lua表的資料必須是唯讀的,如果不滿足以上條件,一切優化都是錯誤的。所以在最後我們需要把整個表改為唯讀,以保護資料不被錯誤篡改。

優化後變成了下面這樣:

local __rt_1 = 

local __rt_2 =

local __rt_3 =

...local __rt_34 = ,

shield = 6,

show_name = "@470882",

subtype = 4

}...

--超出lua區域性變數個數,則需要另外單獨儲存和引用

--createtable是把c中建立表的函式匯入到lua中,這樣通過建立乙個預分配

--的表,能有效的避免table re-hash,有效利用記憶體

--下面建立乙個預分配919個陣列array-part、0個元素的空hash-part

local __rt = createtable and createtable( 919, 0 ) or {}

__rt[1] =

__rt[2] =

__rt[3] =

...local mapsetting = ,

,shield = 0,

show_name = "@424100",

...},

,}...

--大量的預設值儲存在這裡

local __default_values =

...do

local base =

for k, v in pairs( mapsetting ) do

setmetatable( v, base )

endbase.__metatable = false --不讓外面獲取到元表,防止被無意修改

endreturn mapsetting

看上去可讀性沒有原始的那麼高了,一些被多處引用的子表已經被替換成了乙個變數,這些變數是以local的形式儲存在作用域的。由於lua本身的一些限制,乙個作用域內能夠存放的最大local變數的個數是200個(lparser.c #define maxvars 200),所以超過個數限制的多餘部分表會被放入乙個臨時陣列中,初始化的時候需要額外的查表,稍微多一些開銷,但可以接受。

◆◆◆

歸納總結

一般來說配置表檔案優化後只有之前不到一半的大小,大量的重複資料被優化掉了,極大地提公升了載入時間和記憶體占用。

前後檔案對比如下:

最後說下宿主語言環境中,如果需要讀取lua表中的子表資料,我們可以把該錶的pointer拿出來作為鍵值,存放於查詢表中,這樣宿主環境中也能讀取到乙個唯一的陣列,節約記憶體。

Lua配置表儲存優化方案

近幾年移動端遊戲大熱,unity lua更是手遊行業的標配技術。如何有效利用有限的硬體條件,實現當前高品質 高規格的遊戲產品是持久不變的話題。lua作為乙個極為精簡的嵌入型指令碼語言,已經廣泛地用在了遊戲業,lua的存在一般是兩種場合,一種用於實現遊戲上層業務邏輯,一種則利用了lua語言本身靈活簡單...

Innodb IO優化與配置方案

對於資料庫來講大多瓶頸都出現在io問題上,所以現在ssd類的裝置也才能大行其道。那資料庫的io這塊有什麼可以優化的嗎?我這裡大致談一下我的看法,希望能達到乙個拋磚引玉的效果。這裡談一下資料庫本身的配置方面。配置方面對於io優化的原則 盡可能能快取,減少讀對資料庫的隨機io的請求 同時減少寫的隨機io...

Unity遊戲配置儲存方案

配置檔案格式如下圖 第一行是列型別說明,第二行是描述,第三行是對應屬性名稱,用於反射,之後行是實際資料 r n換行,t分列,單元格內依次由 分割 long string string string string intsid 活動標題 活動活動名字 活動描述 是否可見 idtittle icon n...