zoukankan      html  css  js  c++  java
  • 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表占用的内存空间,从而极大的优化你的项目。我就说这么多了,具体的优化还是需要大家自己动手解决。如果你有什么疑问,可以在下面留言一起讨论~

  • 相关阅读:
    linux-Windows文件上传Linux
    linux-ifconfig 查看没有IP
    springBoot 发布war/jar包到tomcat(idea)
    linux-常用命令
    (转)JVM各种内存溢出是否产生dump
    数据库缓存的几种方式
    使用jprofiler分析dump文件一个实例
    Hibernate之一级缓存和二级缓存
    最佳实践 缓存穿透,瞬间并发,缓存雪崩的解决方法
    缓存与数据库一致性之三:缓存穿透、缓存雪崩、key重建方案
  • 原文地址:https://www.cnblogs.com/zblade/p/6893574.html
Copyright © 2011-2022 走看看