精华内容
下载资源
问答
  • lua源码学习 零

    2019-08-28 17:00:05
    今天用到了pcall功能,之前没用过,了之后也不知道效率怎么样,网上也没找到,想着自己敲了两年的lua也是也要好好了解下这个老伙伴了,在这里就留下一些学习资料,后面慢慢加吧 参考: lua源码:开始 Lua 源码...

    lua源码学习 零

    思路

    今天用到了pcall功能,之前没用过,用了之后也不知道效率怎么样,网上也没找到,想着自己敲了两年的lua也是也要好好了解下这个老伙伴了,在这里就留下一些学习资料,后面慢慢加吧

    记录

    20190828 首次阅读云风大大的Lua源码欣赏

    参考:

    lua源码:开始
    Lua 源码欣赏.云风.2013.04.17

    展开全文
  • 由于工作需要了很多年的lua编写各种逻辑处理模块,今天心血来潮,决定深入了解一下lua源码的实现,目的是方便自己的lua代码调试,省的每次都print打印这种原始手段,本“长篇小说“主要弄懂以下的问题: ...

    由于工作需要用了很多年的lua编写各种逻辑处理模块,今天心血来潮,决定深入了解一下lua源码的实现,目的是方便自己的lua代码调试,省的每次都用print打印这种原始手段,本“长篇小说“ 主要弄懂以下的问题:

    1 local , global, upvalue 的原理和实现,upvalue的查找和递归标记是什么?

    2 Function是什么,执行过程如何,参数如何传递,怎么分配栈上空间?

    3 循环结构的实现

    4 模块的实现,closure是什么

    5 各种元表的实现,基本类型的元表如何增加(lua内部职能给table加元表,number,string这些都需要外部增加)

    6 各种库方法的实现,如debug, math, string, os库等,浏览一遍有个概念即可

    7 判断和跳转的实现

    8 钩子函数的实现和应用

    9 报错是如何组织的,各项信息在哪里保存的,又如何获取?

    10 lua常量是什么,为什么要共享同一份常量?

    11 gc回收是什么,如何实现的,流程是什么?

    12 table类型的存储和访问,分数组类型和哈希类型

     

    万里执行始于足下:先从最简单的local变量开始:

    一、主要流程先表述一下:解析lua语言,生成c代码  >>>>>  调用c代码

    前面的各种函数调用封装,检测错误封装暂且不表,直接进入最终解析语法的开始函数这: f_parser(lua_State*L ,void* ud)

    ud: 源代码已经读入到ud里面了(简单的fread, 读成字符串形式)

    f_parser做了总的来说两件大事:

            a: 调用luaY_parser 解析并生成一个Proto* tf (c语言形式的目标字节码),

            b:创建一个新的closure(暂且称为闭包cl), 把tf  的 数据 装入闭包cl中 ,最后把cl压栈, 算是完成了解析;    

    解析完毕后,源代码统统已经转化为c语言的代码了(即得到上面的cl), 接下来就调用这些生成的c语言代码,处理各种源代码想要做的事,赋值计算等等。。。

     

    二、 深入追踪一下luaY_parser  解析lua代码并生成c代码的过程;

    变量的生成并不会生成字节码,直接就分配内存转成目标类型而已, 对变量的赋值才会生成字节码。

    以local为例: local a=3

    f_parser 首先读入源代码,新建一个FunctionState fs临时变量,用于解析,然后调用一个open_func函数,该函数新建一个proto*f,用于存放所有解析到的信息 然后将fs->h压栈,fs->f压栈, 接着解析源代码 luaX_next(), 解析到第一个token;

    根据第一个token, chunk()开始进入模块的解析, 这里是进入statement();它会循环调用statement,直到整个模块解析完毕

    statement:

    --->luaX_nest();   // 解析下一个token,这里返回TK_LOCAL, 根据TK_LOCAL,会继续解析下一个token,返回TK_NAME,即变 

         量名a,  注意:期间读到的“local”,"a"等单独的元素,都会在fs->h中嘻哈一个Node,整个node对于变量没什么用,直接赋值为

         bool类型1,以保证整个node不会被回收,对于常量(数字,字符串等),则保存常量在fs->f->k[]数组中的下标index,整个

          fs->f->k[]数组保存该模块内部出现过的所有常量(为什么要保存,用于共享常量?留待后续研究:初步猜测是因为lua字

           节码是伪寄存器指令(4字节一条指令),空间有限,无法直接使用常量地址或者常量,所以转换成数组下标,这样就可以装进指令里了)。

    ---》localstate(ls);  //接着进入局部变量解析函数,如果是funciton则进入localfunc, 并读入下一个token, 这里为 “ = ”

           ---》new_localvar() ;  // 解析到“=”表示变量定义完毕,准备赋值了,该函数对于每个变量名 , 通过registerlocalvar(name) 

                                          将name保存在f->localvars[]中,然后将位置index保存在fs->actver[fs->nactvar] 中,表示第fs->nactvar

                                         个变量的在f->localvars[]数组中的位置

          ----》explist(ls,e); //解析后面的表达式,这里读入3, 然后进入simpleexp,进入TK_NUMBER的处理,得到一个

                                        expdesc* e,将e的寄存器暂定为0

         ---》adjust_assign() ;   //调整freereg计数,表示freereg之前的寄存器被局部变量占用,并对应变量生成字节码

                       ---》  luak_exp2nextreg();   //生成字节码,确认字节码的reg位置

                                 --》exp2reg(..., freereg-1)  ;  //对于local a = 3来说, 直接在freereg-1处塞入常量3就表示赋值完毕

                                                                             //得到字节码  OP_LOCAK , reg, 3

    ----》close_func();  //至此表示模块解析完毕,调整各项函数指标(局部变量个数,执行开始地址的),并生成OP_RETURN

    ----》return f;  //返回得到的函数(指令序列和各种变量数据等)

    接下来就进入调用环节了:

      ---》luaF_newLclosure(f);  //将f包装成 closure并压栈

    ---》lua_insert(L,base) ;  //作为 函数 f 的栈起始位置

    --->lua_pcall() //调用函数

                      。。。。。----》luaV_execute();  //最终处理lua函数的地方,留待后续研究

     


    至此,local变量的流程已经走完,总结下

    fs->actvar[]  :  保存的是local变量名所在数组的下标(local变量的值一直在对应的栈中,直到函数调用结束)

    fs->f :  解析得到的字节码指令序列载体

    fs->f->localvars[],   真正保存local变量名所在的数组

    fs->h[],  变量的哈希表,保存变量对应的(key,value)数值,暂时不知道干什么用的,可能用于debug吧

    今天就先到这儿了,一个人的思路有限,难免有错漏,欢迎指正。。。

     

     

     

     

    展开全文
  • windows源码编译lua

    2019-09-22 20:39:55
    这个玩意,我也不知道怎么它的库,没法. 他自带的makefile,对windows没用. 参考这里,编译lua. 1,先打开VS2017,然后点新建中的从现有项创建项目,将lua的src文件夹包括进去. 2,将里面的lua.c及luac.c删除. 3,改属性....

    lua网站这里
    这个玩意,我也不知道怎么要用它的库,没法.
    他自带的makefile,对windows没用.
    参考这里,编译lua.
    1,先打开VS2017,然后点新建中的从现有项创建项目,将lua的src文件夹包括进去.
    2,将里面的lua.c及luac.c删除.
    3,改属性.将sdk改为类似10.0.17763.0.exe=>静态库.
    4,F7编译.
    就成功了.这个例子的特点.就是我没有sln文件,怎么处理.以后就可以照着这样处理.
    一堆cpp,直接建立库.就可以用了.
    后面的操作,再加上lua.c,luac.c编译luac,就没亲自动手了.应该行的.

    展开全文
  • lua-resty-puzzle-源码

    2021-05-23 23:43:45
    Lua用数字和SHA1创建SHA1 然后发送SHA1和SEED并询问号码 浏览器JavaScript使用forloop找出数字 Javascript发送结果并获取Cookie OpenResty站点配置示例 # Location of this Lua package lua_package_path "/opt/...
  • Lua新增使用内存量达到一定数字时触发GC执行 2、这个新增使用内存量是怎么定的? Lua使用GCdebt变量来预设下次触发完整GC时机和触发下次单步GC时机 (时机:新使用内存增量时间间隔) 3、每次单步执行执行多久? ...

    GC是分步执行的,先来思考几个问题:
            1、什么时候触发执行?
                Lua是用新增使用内存量达到一定数字时触发GC执行
            2、这个新增使用内存量是怎么定的?
                Lua使用GCdebt变量来预设下次触发完整GC时机和触发下次单步GC时机 (时机:新使用内存增量时间间隔)
            3、每次单步执行执行多久?
                这个时间也是与GCdebt有关
            4、Lua可回收对象有三种颜色,白色、灰色和黑色.
                白色表示没有被标记的对象,白色有两种每次完整GC后切换;
                灰色表示标记过的对象,但可能引用未标记的对象;
                黑色表示标记过的对象,并且它引用的对象都标记过;
              GC在繁殖和原子阶段有个不变式:黑色对象不能指向白色对象
              i:什么时候清理未标记的白色对象,切换白色?
                原子阶段执行完后切换白色,之后阶段就是清理
              ii:怎么保证上面的不变式不变?
                barrier函数
            
    一、global_State 部分变量说明

        1、GCdebt 没有被回收器补偿的分配字节,预估内存借债,新申请的内存超过此值,则触发GC。
        
        2、GCestimate 使用中的非垃圾内存的估值(与当前内存实际分配数量大约相等)
        
        3、totalbytes: 当前已经分配的内存+预估要分配的内存, 真实占用内存为totalbytes + GCdebt(可正可负). 
           其中预估要分配的内存相当于GC借的债,一旦真正分配的内存超过借债时,就要触发GC了。
           触发一次GC若不能完整跑一遍GC流程则再借债时根据gcstepmul调整下次单步GC的粒度;若触发一次GC完整
           跑一遍GC流程则再借债时根据GCestimate和gcpause确定借债额度(这个值会影响本次完整GC和下次完整GC之间的间隔,即是每次完整GC的频率)
        
        4、gcstepmul控制本次单步gc时间和触发下次单步GC内存增长值

           STEPMULADJ = 200
           单步GC函数如下:

    /*
    ** performs a basic GC step when collector is running
    */
    void luaC_step (lua_State *L) {
      global_State *g = G(L);
      l_mem debt = getdebt(g);  /* GC deficit (be paid now) */
      if (!g->gcrunning) {  /* not running? */
        luaE_setdebt(g, -GCSTEPSIZE * 10);  /* avoid being called too often */
        return;
      }
      do {  /* repeat until pause or enough "credit" (negative debt) */
        lu_mem work = singlestep(L);  /* perform one single step */
        debt -= work;
      } while (debt > -GCSTEPSIZE && g->gcstate != GCSpause);
      if (g->gcstate == GCSpause)
        setpause(g);  /* pause until next cycle */
      else {
        debt = (debt / g->gcstepmul) * STEPMULADJ;  /* convert 'work units' to Kb */
        luaE_setdebt(g, debt);
        runafewfinalizers(L);
      }
    }

           luaC_step过程:
          1) 计算本次单步gc需要遍历的对象字节数: debt = (debt / STEPMULADJ + 1) * gcstepmul 
          2) do {} while循环遍历对象,work为遍历到的对象所占字节. debt值要小于等于-GCSTEPSIZE(64位linux下值为2400)才会停下.

          3) 计算触发下次单步GC内存增长值:debt = (debt / g->gcstepmul) * STEPMULADJ

          如果gcstepmul 为200,  则基本是内存额外增量为多少,本次gcstep额外就要遍历多少内存
          如果gcstepmul 小于200,则要遍历的额外内存少,触发下次GC的内存增涨量变大(gcstep的时间较短,一次完整GC每步之间的间隔较长)
          如果gcstepmul 大于200, 则要遍历的额外内存多,触发下次GC的内存增涨量减少(gcstep的时间较长,一次完整GC每步之间的间隔较短)
          
        5、gcpause控制每次完整GC间的间隔(即完整GC频率)
           threshold = GCestimate / 100 * gcpause(默认200) 
           debt = totalbytes - threshold ~~= totalbytes * (1 - gcpause / 100)
           如果gcpause为200, 则当内存分配超过当前内存一倍时才触发下次完整GC
           如果gcpause <= 100,则基本每完整GC跑完后就会开始下一轮完整GC
           说明gcpause值越小完整GC频率越高
           
        6.GCmemtrav 单步中GC遍历的内存记录
        
        
        ---------------------Lua中所有对象一定在7到10中某个链表上---------------------
        7、allgc 所有没有被标记为自带终结器的对象链表    
        8、finobj 所有被标记为自带终结器的对象链表    
            新增元素的地方:
            1)第一次设置table的元表且元表中含有__gc方法,此table对象会从allgc链表中移除
            2)第一次设置userdata的元表且元表中含有__gc方法时,此userdata对象会从allgc链表中移除
        9、tobefnz 将要被释放的对象链表    
        10、fixedgc 不会被回收的对象链表
        
        
        11、gray 常规灰色等待被访问对象链表
        12、grayagain 在原子阶段必须被重新访问的灰色对象链表
            包括:在白色barrier中的黑色对象;在繁殖阶段的所有类型弱表;所有线程
            新增元素的地方:
            1)繁殖阶段遍历弱值表时
            2)繁殖阶段遍历弱key表时
            3)遍历线程时
            4)将黑色结点变灰色向后barrier时
            
        ---------------------13到15链表仅仅在原子阶段有效---------------------
        13、weak 弱值表对象链表
            新增元素的地方:
            1)非繁殖阶段遍历弱值表含有可能需要清理的值时
        14、ephemeron 蜉蝣对象(弱key表)链表,含有白色->白色结点
            新增元素的地方:
            1)非繁殖阶段遍历弱key表时有结点的key和value都为白色
        15、allweak 有弱键和/或弱值将被清理的表
            新增元素的地方:
            1)非繁殖阶段遍历弱key表时含有可能需要清理的key且其value标记过
            2)遍历表时表是弱key且弱值型

    二、GC各阶段具体执行步骤        

        标记函数: 标记对象为灰色,这里仅把部分添加到gray链接中等待繁殖阶段一个个遍历,因为这些对象引用到的对象可能比较多,为了避免访问元素过多耗时
            1) 短、长字符串对象直接标记为黑色
            2) 用户数据对象: 标记元表,将此对象标记为黑色,标记设置的用户对象
            3) Lua闭包和C闭包都添加到gray链表中
            4) 线程添加到grayagain链表中
            5) 函数原型添加到gray链表中
            
        1、GCSpause 暂停阶段
            重启垃圾回收:
            gray grayagain 链表都置为空
            weak allweak ephemeron 都置为空
            标记主线程 标记注册表 
            标记基本类型的元表
            标记上个循环留下来的将要被终结的对象
            
        2、GCSpropagate 繁殖阶段
          遍历标记: 访问灰色对象
            将灰色对象标记为黑色,表示此对象及其引用的对象都被标记过,并从灰色链接中移除
            1)表对象的遍历:
                1:标记元表
                2:表为弱表,则将表再标记为灰色
                  i: 表为弱值型,则仅标记哈希部分值不为空的key对象.若当前在繁殖阶段则将此弱表链接到grayagain上,
                     等待原子阶段再次被访问;若在原子阶段且表有数组部分或哈希部分有值为白色则将此表链接到weak上.
                  ii:表为弱key型,则仅标记结点值对象.若在繁殖阶段则将弱表链接到grayagain上;若在原子阶段且哈希部分有白色key指向白色值则将弱表链接到ephemeron上;若在原子阶段且哈希部分有白色key则将弱表链接到allweak上.
                  iii:表为弱key弱值型,则将表链接到allweak上.
                3:表为强表,则标记所有结点的key,value
            2)Lua闭包的遍历:
                1:标记原型
                2:在原子阶段标记所有上值,在非原子阶段仅标记闭合的上值.(开放的上值指向的值在线程中,因此那些值在非原子阶段线程被遍历时会被标记.
                  且那个阶段上值在线程中不能被改变,不也会被再次遍历)
            3)C闭包的遍历:
                1:标记上值
            4)线程的遍历: 先将线程从gray链中移除,并添加到grayagain链上,把颜色变为灰色.
                1:标记栈
                2:若当前为原子阶段,则置栈顶到栈上限元素为nil;若不在开放上值线程链表上且有打开的上值,则将此对象链接到开放上值线程链接中
                3:若当前不是原子阶段且GC类型不是KGC_EMERGENCY,则收缩线程的栈
            5)函数原型的遍历:
                1:如果有上次创建的闭包缓存,则置缓存为NULL
                2:标记源文件信息
                3:标记常量
                4:标记上值名字
                5:标记内嵌的函数原型
                6:标记局部变量名
                
        3、原子阶段
            1)首先确保gray链表为空,不为空则遍历gray上所有元素
            2)置当前GC状态为GCSinsideatomic
            3)标记当前运行的线程
            4)标记注册表
            5)标记基本类型的元表
            6)标记上值:
                1:若线程不为灰色或没有上值,则从有开放上值的线程链表(twups)中移除,并标记所有触碰过的上值
            7)再次遍历gray上所有元素
            8)遍历grayagain链接上所有元素
            9)循环遍历浮游链表上弱key表(因为上面的步骤可能导致key变为黑色),直到没有需要标记的结点,最后浮游链表上的元素部分仍然是之前链表上的元素
            --------- 至此所有可被访问的强对象都被标记了 ----------------
            10)清理weak链表上弱表中可能需要被清理的值
            11)清理allweak链表上弱表中的可能需要被清理的值
            12)把finobj链表上没有被标记的对象移动到tobefnz链表上
            13)标记tobefnz链表上的元素
            14)再次遍历gray上所有元素
            15)执行第9步
            --------- 至此所有复活的对象都被标记了 ----------------
            16)清理ephemeron链表上弱表中的可能需要被清理的key
            17)清理allweak链表上弱表中的可能需要被清理的key
            18)清理weak链表上12)步之后新增弱表中的可能需要被清理的value
            19)清理allweak链表上12)步之后新增弱表中的可能需要被清理的value
            20)清理字符串缓存
            21)切换白色    
            22)进入清理阶段
                用sweepgc记录下次该清理哪个元素
            分析:执行10,11步是因为即使弱key表上结点的value可能在12到14步被标记,但实际也是将要被终结的对象,因此要把这个弱值置为nil
                    
        4、清理所有对象阶段

        5、清理finobj链表上对象阶段:原子阶段已经把白色对象转移到tobefnz上,这里仅仅是切换白色
            
        6、清理tobefnz对象:切换白色

        7、清理结束:将主线程切换白色

        8、调一些在tobefnz上对象的终结器
            GCTM调用对象自定义终结器函数:
            1)先将对象从tobefnz移动到allgc上,重置终结标记,如果是清扫阶段,则将对象置为当前白色。这里仅把对象移动到allgc上而不是直接清理,会在下一个GC清扫阶段
            2)调用自定义的终结器函数
            
    三、barrier函数
            
        luaC_barrier_函数说明:
            p为黑色,v为可回收对象,并且v为白色
            1)若当前GC是需要保持不变式状态(繁殖或原子阶段),则标记v对象;
            2)否则为清扫阶段,则把p标记为白色,因而说此函数是向前barrier,直接把p跳过清扫时白色切换
            
            调用地方:
            1)lua_copy:若被复制到的位置是C闭包的上值
            2)lua_setuservalue
            3)lua_setupvalue:若是为C闭包设置上值
            4)addk 向函数原型中添加常量时
            5)lua_setmetatable
            6)registerlocalvar 向函数原型注册局部变量
            7)newupvalue 解析时函数原型添加新的上值名
            8)addprototype 解析时函数原型添加新的内嵌函数原型

        luaC_barrierback 函数说明:
            p为黑色,v为可回收对象,并且v为白色
            将p变为灰色并链接到grayagain链表上
            调用地方:
            1)lua_rawset
            2)lua_rawseti
            3)lua_rawsetp
            4)luaH_newkey
            5)luaV_finishset
            6)执行OP_SETLIST
            7)luaV_fastset

        luaC_upvalbarrier 函数说明:
            uv的值是可回收的且是闭合的
            若是繁殖或原子阶段则标记uv的值
            调用地方:
                1)lua_load
                2)lua_setupvalue:若是为Lua闭包设置值
                3)lua_upvaluejoin
                4)luaF_close
                5)OP_SETUPVAL
        
        分析:由于对table操作频率比较高,因此触发到barrier条件时使用向后barrier。把表添加到grayagain链表上,等到后面重新遍历一次。
            其他barrier操作涉及的情况比较简单,操作频率理论不高,因为是向前barrier
                   

    展开全文
  • 这个怎么运作? 在PUC Lua 下,它检查字节码以获取size_t的大小。 在LuaJIT 上,它调用ffi.abi来获取架构。 该模块导出单个函数,调用该函数时将返回 32、64 或在无法确定位数时抛出错误。 它在哪里工作? 在 x86...
  • ConkyLuaMakerGUIv2 ...怎么运行呢? 它使用python3,您需要安装一些要求: pip3 install -r requirements.txt 将会安装 : pygame(pygame.draw) pygame-gui 然后就跑 python3 conky_lua_maker_main.py 仅在
  • 为了调用一个Lua函数, 你可以或者 call_function() 或者 一个对象(object). template Ret call_function(lua_State* L, const char* name, ...) template Ret call_function(object const& obj, ...) call_...
  • Lua学习---编译生成lualuac

    千次阅读 2017-07-12 16:14:54
    众所周知,Lua是一种强大的脚本语言,并且这种语言是C语言实现的。为什么要学习这门语言?因为它可以增强我看C语言代码的功底。我下的Lua版本是Lua5.3,关于Lua5.3的简介如下:...
  • 具体问题是这样的,我命令行新建的cocos项目(cocos3.9),也就是cocos new -l lua 之类的,VS2013打开的,然后在Sublime上打开项目的源码一个批处理文件来执行代码,但是显示的HelloWorld窗口很大,和屏幕...
  • 1. 项目主页 http://www.lua.org/ 2. 当前最新稳定版本 5.1.4,2008年8月发布 ... 解压后,Visual Studio 2008命令行环境进入lua目录,运行etc\luavs.bat。之后会在src目录下生成lua.exe、luac.
  • lua代码解释器

    2019-08-31 12:40:41
    上一章节我们已经把Lua源码下载编译出来了,那么这个Lua源码编译出来的exe文件和lib文件有什么用,怎么用呢。 在遇到复杂多变逻辑的时候,我们不希望每次都需要更改C++源代码,于是把常用的类抽象出来,整和成Lua...
  • 学习lua第一步-lua解释器luac.exe

    万次阅读 2009-05-05 12:35:00
    上下载下lua源码vc建个控制台的工程,将src目录下除luac.c外的其他文件复制过来,然后包含进这个工程,编译生成exe,这个就是lua的解释器了。用法我还没怎么搞懂,就只知道 lua -i 文件名.lua 就是解释执行一...
  • 在部门里用Lua实现了一个RichText富文本,主要用到了一些Lua的模式匹配,想到之前也有好几次使用Lua string库的经验,虽然不多,也没怎么读过Lua源码,但还是想拿出来与人分享。 Lua的模式匹配极为强大,掌握之后...
  • lua调用C++函数

    2019-11-20 09:42:04
           实际上,...稍后我们会从源码的角度来看一下这个实现,现在首先来说说怎么lua调用C++的函数。        首先要明确一点,就是lua和C++之间的交互依然是通过栈来实现的,通过栈进行数据交互。那么我...
  • lua元表学习

    2014-04-20 23:35:17
    源码看了,但是怎么用的还是要看 lua in programming:
  • 所以自己打算写博客告诉大家,我是怎么实现的,并且提供完整源码。github工程地址 使用的unity2019.3.0 + xlua。改成其他lua也是可以,只要在传入luaEnv的时候做相应改动就可以了。 这个功能大体分为两大步: ...
  • lua探索之路(1)

    2020-05-27 11:18:03
    又开始了lua的探索,记不清是什么原因让我开始这次探索的。客观存在的条件是:目前网上...那么我搞这个lua也要参考一些lua源码了,包括: elua(官网) https://github.com/elua nodemcu官网 https://github.com...
  • LuaStudio - Free game development tool/engine. Create games and other graphic focused apps on Windows using Lua/LuaJIT programming language. Export them to many platforms including iOS, Android and ...
  • Cocos2d-x Lua 读取Csv文件,更方便的使用数据

    万次阅读 热门讨论 2014-08-01 08:26:13
    我的书上或者是我曾经出售的源码里,都有Csv文件的影子。...Csv格式的文件,解析起来也很简单,所以自己动手写写很快~(小若:我就喜欢拿来主义,你怎么着) 最近在用Lua写游戏,对于技能、怪物等配置
  • cocos-lua使用骨骼动画

    千次阅读 2018-05-11 16:28:47
    先说导入引用--第一个参数是spine导出的3个文件中json文件,第二个参数是atlas文件,第三个参数是显示的倍数,如果不知道spine怎么导出,可以去这里看local girl = sp.SkeletonAnimation:create("block/...
  • 当我这个api来替换韩语、越南语就怎么搞都不行,即使打印出来的字符串看上去一摸一样,打印每个字符对应的数字编码也是一样的,但这个api死活就是不给替换,怀疑这个api对小语种有bug,工作太忙没什么时间去看它的...
  • # port install mpv +uchardet -bundle -rubberband configure.args="--enable-libmpv-shared --enable-lua --enable-libarchive --enable-libbluray --disable-swift --disable-rubberband" Copy the latest ...
  • Lua C C/C++ - General-purpose language with a bias toward system programming and embedded, resource-constrained software. R - Functional programming language and environment for statistical ...
  • 直接上源码:注意源码有两部分,第一部分是一开始的时候写在模块内部的,另一部分是存在手机内部的,方便后期更新功能 看第一部分的源码 亲们可以直接把下面的第一部分(注意只...怎么下载看我以前的文章,LUA开发的 ...
  • 07_AsyncTest: 展示怎么用lua协程来把异步逻辑同步化。 08_Hotfix: 热补丁的示例(需要开启热补丁特性,如何开启请看指南)。 09_GenericMethod: 泛化函数支持的演示。 10_SignatureLoader: 展示如何读取经数字...
  • 前几天在swift项目中集成了Lua模块,使得在swift工程中用Lua写游戏逻辑成为了可能,具体工程及配置见,由于公司最近要把js做的小游戏集成到iOS原生应用中,于是我们将解锁另外一个场景,好了,下面开始; 同样的,...
  • 07_AsyncTest: 展示怎么用lua协程来把异步逻辑同步化。 08_Hotfix: 热补丁的示例(需要开启热补丁特性,如何开启请看指南)。 09_GenericMethod: 泛化函数支持的演示。 10_SignatureLoader: 展示如何读取经数字...
  • 源码阅读 sync.map net/http i/o timeout , 希望你不要踩到这个net/http包的坑 mutex channel context select实现原理 main函数背后的启动过程 内存管理 GC垃圾回收 timer 汇编 汇编入门 推荐书籍 ...
  • 将 drcom_2016.lua 放到 Wireshark.exe 所在的目录下, 打开 init.lua ,在 dofile(DATA_DIR.."console.lua") 之后添加 dofile(DATA_DIR.."drcom_2016.lua"). 之后就可以在过滤器中使用 drcom 协议了。 其他最新...

空空如也

空空如也

1 2
收藏数 38
精华内容 15
关键字:

lua源码怎么用