lua中 table 重構index/pairs元方法優化table內存占用


 

  轉載請標明出處http://www.cnblogs.com/zblade/

  lua作為游戲的熱更新首選的腳本,其優勢不再過多的贅述。今天,我主要寫一下如何重寫lua中的元方法,通過自己的重寫來實現對lua中的常用方法特定編寫,從而實現對table的重構。

  table中關鍵的一點是使用setmetatable和getmetatable,分別是對table進行元表設置和讀取。

一、lua中table的元方法

     table中的元方法主要分為算術類和關系類的元方法,算數類元方法可以分為:加(_add)、減(_sub)、乘(_mul)、除(_div)、求模(_mod)、求冪(_pow)。這兒我就舉例復寫兩種代表的方法加和乘,其他幾種方法都可以類似的復寫。

     1、add方法的復寫

st = setmetatable
gt = getmetatable

mt = {}

--復寫mt的加方法
mt.__add = function(tA, tB)
    local c = {}
for k, v in ipairs(tA) do table.insert(c, v+1)
    
end return c end

local A= {1,2,3} local B= {4,5,6} st(A, mt) st(B, mt) local C = A + B for k, v in ipairs(C) do print(v) end output: 2 ,3 ,4

    2、mul方法的重寫

mt.__mul = function(tA, tB)
      local c = {}  
      for k , v in ipairs(tA) do
          table.insert(c, v+2)
       end
      return c
end

local A = {1, 2, 3}
local B = {4, 5, 6}
st(A,mt)
st(B,mt)
local C = A*B
for k , v in ipairs(C) do 
print(v)
end

output: 3, 4, 5

  分析可以知道,其實只需要我們對於元表的元方法進行重寫,然后進行一個setmetatable的操作,就可以讓我們的指定的table的對應的元方法變成我們重寫的方法了。其他的幾種方法和關系類的相關方法都可以用類似的方法實現。

二、對於table中的pair/index的元方法的重寫

      上面說到的基本方法在應用中比較少見,在table中應用最多的是pairs/ipairs/index兩種方法,如果我們合理的重寫這幾種方法,可以極大的提高元表的效率。在這兒我列舉一種優化方案:在很多時候我們需要對游戲中的table中的元素進行遍歷,如果我們能夠將游戲中的配置表進行優化,采用默認的table來取代最高頻率出現的表,則我們可以極大的優化配置表的大小。talk is cheap, show the code, 下面用代碼實現這種優化策略:

    local st, gt = setmetatable, getmetatable
    local mt = {}
    local default = {
        ["name"] = "zblade",
        ["telphone"] = 123456,
        ["id"] = 7,
        ["school"] = "uestc"
    }
    --復寫index
    mt.__index = function(tbl, key)
        local val = rawget(tbl, key)
        if val then 
            return val
        else 
            return default[key]
        end
    end

    local func = function (tbl, key)
        local nk, nv = next(default, key)
        if nk then 
            nv = tbl[nk]
        end
        return nk, nv
    end
    --復寫 pairs
    mt.__pairs = function (tbl, key)
       return func, tbl, nil
    end

    local test = {
    ["id"] = 8
    }

    st(test, mt)
    --測試pairs的復寫
    for k, v in pairs(test) do 
        print(v)
    end
   -- output: 8 , uestc, zblade, 123456

    --測試 index的復寫
    print(test.id)
    print(test.name)
    print(test.school)
    print(test.telphone)
   -- output: 8 , uestc, zblade, 123456

  如果你能看懂上面的代碼,那么你一定知道如何優化你項目中的lua表了,通過巧妙的重寫index和pairs方法,你可以大大的節省你lua表占用的內存空間,從而極大的優化你的項目。我就說這么多了,具體的優化還是需要大家自己動手解決。如果你有什么疑問,可以在下面留言一起討論~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM