Lua
文章平均质量分 63
凯奥斯
可能是最不会写注释的程序员。
展开
-
Lua语法小贴士(三)魔法字符
介绍Lua里的魔法字符,用来对字符串进行模式匹配。原创 2016-10-11 11:48:26 · 4295 阅读 · 0 评论 -
Lua语法小贴士(十六)pairs和next
今天看到一个帖子,是关于lua优化的,上面说清空一个表的时候,pairs的效率是next的500倍。我记得for pairs循环实际上就是调用的就是next,还特意查了源码,应证了我的记忆。源码就不贴了,直接给结论。原创 2017-09-14 12:10:29 · 5458 阅读 · 1 评论 -
luajit官方性能优化指南和注解
luajit是目前最快的脚本语言之一,不过深入使用就很快会发现,要把这个语言用到像宣称那样高性能,并不是那么容易。实际使用的时候往往会发现,刚开始写的一些小test case性能非常好,经常毫秒级就算完,可是代码复杂度一上去了,动辄几十上百毫秒的情况就会出现,性能表现非常飘忽。为此luajit的mailling list也是有不少人咨询,作者mike pall的一篇比较完整的回答被放在了官方wiki上: http://wiki.luajit.org/Numerical-Computing-Perfor转载 2017-09-15 10:45:48 · 1227 阅读 · 0 评论 -
Lua语法小贴士(十一)debug库
Lua的调试库包含两种函数:自省函数和钩子。自省函数可以用来检查一个正在运行的程序的信息,而钩子可以跟踪程序的运行。原创 2016-11-05 23:50:19 · 8982 阅读 · 0 评论 -
Lua语法小贴士(十五)upvalue
我们都知道,Lua里面的function实际上都是闭包(closure),而upvalue便是它引用到的上下文变量(“引用到”三个字很关键),业界一般又称为外部局部变量(external local variable),如果要翻译的话,个人偏好翻译为“上文变量”。原创 2017-09-08 11:29:05 · 3128 阅读 · 0 评论 -
Lua源码揭秘(二)一个简单的数学扩展库函数
之前遇到过一个问题,在我们的游戏中大量使用了atan方法,但是atan的方法太费了,所以我们使用了泰勒展开式来求一个近似值。 arctan的泰勒展开式为: arctan(x)=x−13x3+15x5−17x7⋯+(−1)n−12n−1x2n−1arctan(x)=x-\frac{1}{3}x^3+\frac{1}{5}x^5-\frac{1}{7}x^7\cdots+\frac{{(-1)}^{原创 2017-10-28 17:05:21 · 1325 阅读 · 0 评论 -
Lua源码揭秘(三)一个比较简单的table库扩展
有了上一篇 Lua源码揭秘(二)一个简单的数学扩展库函数的经验之后,我们尝试写稍微复杂一点的库函数。 我们直接打开ltablib.c(再次强调:在实际工作中的标准做法是在宿主语言中实现)。 添加以下代码:static in values(lua_State *L){ luaL_checktype(L, 1, LUA_TTABLE); lua_newtable(L);原创 2017-10-30 21:12:39 · 1532 阅读 · 0 评论 -
Lua源码揭秘(四)一个不算难的string库扩展
前两篇Lua源码揭秘(二)一个简单的数学扩展库函数Lua源码揭秘(三)一个比较简单的table库扩展分别对math库和table库进行了扩展,本篇就继续扩展一下string库。 我们直接打开lstrlib.c(再次强调:在实际工作中的标准做法是在宿主语言中实现)。 添加以下代码:static int str_split(lua_State *L){ size_t l1 = 0;原创 2017-11-06 18:48:12 · 1005 阅读 · 0 评论 -
Lua源码揭秘(一)概述
由于工作原因,需要撸一波lua源码。相关的文章有很多,其中就有云风未完成的《Lua源码鉴赏》,以及《Lua GC 的源码剖析》,也是我阅读源码过程中的重要参考。“纸上得来终觉浅,绝知此事要躬行”,于是开一个专栏,专门记录此间的心得。 lua版本是5.1.5,(⊙o⊙)…我们项目里实际上使用的是luajit-2.1(⊙o⊙)…莫名的觉得在读luajit之前应当先读一下对应的原生lua版本,于是就走上原创 2017-10-28 15:33:32 · 2615 阅读 · 0 评论 -
Lua源码揭秘(五)绑定Lua之前你需要知道的
lapi.c和lauxlib.c里包含了大部分的lua的capi。所谓capi是指在c形式的api接口,可以在c/c++/c#/…中可以调用到的api,但是lua中并不一定有对应的方法。ldebug.c里有一些调试用的capi(后续文章会介绍)。另外一些capi,便是打开lua库函数的capi,在lualib.h里集中声明。lapi.c基础的capi。state相关lua_checkstatck检查原创 2017-12-02 13:21:48 · 4667 阅读 · 0 评论 -
Lua语法小贴士(五)元表与元方法
Lua里的元表(metatable)是指一套预定操作的集合,而这些操作称为元方法(metamethod)。例如我们可以让两个数字相加,但是却没办法将两个table相加。如果想让表a加上表b,那么就需要使用元表里的__add元方法。原创 2016-10-19 13:59:08 · 1104 阅读 · 1 评论 -
Lua语法小贴士(十四)垃圾回收collectgarbage
Lua垃圾回收只有一个函数collectgarbage,第一个参数是字符串,代表操作类型,第二个参数只有某些操作有,是该操作所需要的参数。原创 2016-11-24 22:17:30 · 15267 阅读 · 0 评论 -
Lua语法小贴士(十三)可变参数与unpack
Lua支持可变参数,用...表示。另外Lua里面可以使用unpack函数将数组形式的table拆开。原创 2016-11-23 22:40:49 · 8002 阅读 · 0 评论 -
Lua语法小贴士(一)字符串基础操作
字符串是Lua里面非常常用的类型,本文就介绍一下字符串的一些相关操作。原创 2016-10-10 13:38:28 · 16032 阅读 · 0 评论 -
Lua语法小贴士(二)string库
Lua语言string库方法介绍。原创 2016-10-11 11:25:31 · 2268 阅读 · 0 评论 -
Lua语法小贴士(四)字符串缓冲
我们在写Lua代码的时候,如果需要对一个字符串进行反复的连接操作的话,会造成极大的性能开销。因为字符串是不可变的值,所以当我们对字符串操作的时候,每次都会生成一个新的字符串。例如我们需要对一个10000字节的字符串str增加一个字符的时候,就会创建一个10001字节的字符串str_copy,然后再复制str到str_copy里面。所以我们需要字符串缓冲(string buffer)来解决这个问题,而Lua里面,string buffer就可以使用table来实现。原创 2016-10-11 13:53:31 · 1285 阅读 · 0 评论 -
Lua语法小贴士(九)table库
table库方法包括:concat,insert,maxn,remove和sort。原创 2016-11-02 22:46:38 · 985 阅读 · 0 评论 -
Lua语法小贴士(十)全局变量
Lua里我们可以随时声明或调用全局变量。虽然很方便,但是往往会因为拼写错误而导致一些不容易发现的BUG。Lua可以使用_G来表示全局变量所在的表,这样我们就可以修改_G表的__index和__newindex两个元方法(参考Lua语法小贴士(五)元表与元方法)来限制全局变量的访问。原创 2016-11-04 22:44:09 · 1165 阅读 · 0 评论 -
Lua语法小贴士(六)迭代器
Lua里面可以使用for in语句来遍历table,一般会使用内置的ipairs或pairs方法,而这两个方法会返回迭代器(关于迭代器的相关理论知识,参考小话设计模式(十五)迭代器模式)。本文就介绍一下如何自定义迭代器。原创 2016-10-27 14:10:23 · 861 阅读 · 0 评论 -
Lua语法小贴士(七)错误处理
本文要介绍的Lua错误处理包括assert、pcall/xpcall以及debug.traceback。原创 2016-10-28 11:16:38 · 1298 阅读 · 0 评论 -
Lua语法小贴士(八)协同程序
Lua在主线程之外还可以运行一个协同程序。可以通过coroutine的create方法创建一个协同程序,会在yield方法的地方暂停,然后调用resume方法时继续执行。通过使用协程可以把多个方法以可控的方式运行。原创 2016-11-01 22:33:52 · 1220 阅读 · 0 评论 -
Lua语法小贴士(十二)loadstring和loadfile
Lua里面可以使用loadstring来加载一个字符串,字符串中包含了lua脚本。Lua里面还可以使用loadfile,可以加载一个lua文件。原创 2016-11-22 22:30:11 · 7274 阅读 · 0 评论 -
浅入浅出LuaJIT
JIT什么是JITJIT = Just In Time即时编译,是动态编译的一种形式,是一种优化虚拟机运行的技术。 程序运行通常有两种方式,一种是静态编译,一种是动态解释,即时编译混合了这二者。Java和.Net/mono中都使用了这种技术。 然而IOS中禁止使用(不是针对JIT,而是所有的动态编译都不支持)!为什么要使用JIT解释执行:效率低。代码暴露。静态编译:不够灵活,无法热更新。原创 2017-11-25 10:18:06 · 22519 阅读 · 0 评论