Unity3D集成Lua
|
分类
<a href="/categories/#lua之基础" title="lua之基础">lua之基础</a>
|
关于Lua、C# 的语法,这里不做介绍,之前有很多文章都有涉及,可以翻看一下(本文参考资料部分会列出相关文章),OK,接下来专注于C# Lua 热更新技术
LuaInterface
LuaInterface 包括两个核心库,一个是LuaInterface.dll,一个是Luanet.dll,可以通过LuaInterface.dll 完成Lua 与C#(CLR)之间的互相调用
去http://files.luaforge.net/releases/luainterface/luainterface 下载相应版本的LuaInterface,比如我下载1.5.3版本
参考Visual Studio下使用Protobuf,将解压后的lua51.dll、LuaInterface.dll、luanet.dll 放到Unity 项目的Plugins 目录下即可
测试一下,在C# ...
Programming in Lua(Thrid Edition)笔记
4 Statements
多重赋值:先求出所有值,再赋值
交换两值
1x, y = y, x
多余的变量赋nil,多余的值丢弃
用局部变量保护全局变量
1local foo = foo
if-then-elseif-else-end充当switch
1234567891011if op == "+" then r = a + belseif op == "-" then r = a - belseif op == "*" then r = a * belseif op == "/" then r = a / belse error("invalid operation")end
numeric for
123for var = exp1, exp2, exp3 do <somethin>end
exp3可选,为变量的增量1for i= 10, 1, -1 do print(i) end
math.huge用作无穷大
123456for i = 1, math.huge do i ...
Lua入门教程:编译、执行和错误
dofile 与 loadfile 函数dofile 是一个辅助函数,函数 loadfile 才完成了真正的核心工作。 两个函数都是从文件中加载 Lua 代码,但它不会运行,只是编译代码,然后把编译后的代码作为函数返回。与 dofile 不同,loadfile 不会抛出异常,只会返回错误码。
1234function (filename) local f = assert(loadfile(filename)) return f()end
load 函数与 loadfile 类似,但该函数是从一个字符串中读取代码。
编写用后即弃的代码:
123i = 0s = "i = i + 1"load(s)()
该函数加载的代码如果有语法错误,load 会返回 nil 和 错误信息,所以最好使用 assert:
1assert(load(s))()
laod 加载编译时不会设计词法定界,该函数总是在全局环境中编译代码:
123456i = 32local i = 0f = load("i = i + 1; print(i)")g = function ...
高并发抢红包方案--基于Redis lua方案
Redis 2.6 内置Lua解释器
Lua由标准C编写而成,代码简洁优美,完整的Lua解释器不过200k,极易嵌入到其他程序。
Lua和C/C++代码交互容易, 性能和灵活性大大提高。
可作为扩展脚本,也可以作为普通的配置文件,实现复杂的配置逻辑,并且容易理解和维护.
Redis–lua脚本
减少网络开销:本来多次网络请求的操作,可以用一个请求完成,原先5次请求的逻辑放在redis服务器上完成。使用脚本,减少了网络往返时延。
原子操作:Redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。
脚本复用:客户端发送的脚本会永久存储在Redis中,意味着其他客户端可以复用这一脚本而不需要使用代码完成同样的逻辑。1234567redis> EVAL "return 1+1" 0(integer) 2redis> EVAL "return {KEYS[1], KEYS[2], ARGV[1], ARGV[2]}" 4 "msg" "age" 123 "hello world"1) ...
LUA 与 C
栈
使用栈进行lua和C数据交换
要将一个值传给lua,需要先将该值压入栈,然后调用lua api函数,lua会从栈中获取该值并从栈中弹出
入栈API
123456void lua_pushnil(lua_State *);void lua_pushboolean(lua_State *, int bool);void lua_pushstring(lua_State *, const char *s);void lua_pushlstring(lua_State *, const char *s, size_t len);void lua_pushnumber(lua_State *, lua_Number n);// 双精度浮点void lua_pushinteger(lua_State *, lua_Integer n);// 整型,足以存储大型字符串长度,定义为ptrdiff_t类型
栈大小:默认20(LUA_MINSTACK定义),通过如下代码检查栈大小
1int lua_checkstack(lua_State *, int sz)
查询
通过索引查找栈中元素:1栈底 ...
Redis实现分布式锁Lua脚本
简单锁采用键值对存储,键是锁的标识,值是全局唯一值(如uuid)。
获取锁1234567891011121314local key = KEYS[1] -- 锁标识local value = ARGV[1] -- 全局唯一值local ttl = tonumber(ARGV[2]) or 0 -- 过期时间,默认不过期if (redis.call('setnx', key, value) == 1) then if (ttl > 0) then redis.call('expire', key, ttl) end return 1endreturn 0
释放锁1234567891011local key = KEYS[1] -- 锁标识local value = ARGV[1] -- 全局唯一值if (redis.call('get', key) == value) then redis.call('del', key) return 1end return 0
运行 ...
Lua 的标准输出与缓存
最近我遇到了个奇怪的问题,我的一个Lua脚本需要通过shell的重定向将输出追加到一个日志文件中。但是那个Lua脚本的输出在日志文件里看来却不是实时的,输出的文本直到脚本结束时才能看到。
在shell下运行这个程序,是可以看到实时输出的:
-- buffer_test.lua
local socket = require "socket"
local const = 100
for i=1, const, 1 do
print(i)
socket.select(nil, nil, 1)
end
但是当通过重定向时,只有脚本结束后才能看到文件:
# lua buffer_test.lua >>log.txt 2>&1 &
# tail -f log.txt
看来当Lua的标准输出stdout连接的是终端时,采用了行缓存模式,而重定向到文件时则变成了完全缓存。翻遍了Lua的官方文档也没有找到这样的说明。但是在查看stdio的手册页时发现了下面的一段话:
The stdio library is a part of the libr ...
150. Evaluate Reverse Polish Notation
每日一题 2019 - 05 - 12
题目:Evaluate the value of an arithmetic expression in Reverse Polish Notation.
Valid operators are +, -, *, /. Each operand may be an integer or another expression.
Note:
Division between two integers should truncate toward zero.
The given RPN expression is always valid. That means the expression would always evaluate to a result and there won’t be any divide by zero operation.
Example 1:
123Input: ["2", "1", "+", "3", "*"]Output: 9Ex ...
nginx lua 编译安装 « 诗宁
编译安装脚本
主配置文件
systemd启动配置
启动脚本
编译安装脚本
nginx-lua-build.sh
#!/bin/bash
#Date:2018-09-03
#Written by magic5650.
#Readme:install nginx + lua.
#step 0
mkdir /usr/local/nginx
mkdir nginx_lua_build
#step 1
wget -q http://nginx.org/download/nginx-1.13.6.tar.gz
tar xf nginx-1.13.6.tar.gz
#step 2
wget -q https://www.openssl.org/source/openssl-1.1.0i.tar.gz
tar xf openssl-1.1.0i.tar.gz
wget -q https://sourceforge.mirrorservice.org/p/pc/pcre/pcre/8.38/pcre-8.38.tar.gz
tar xf pcre-8.38.tar.gz
wg ...
基于Nginx Lua 和Netflix Eureka的微服务网关
依赖:lua-resty-http
基于Nginx&Lua 和Netflix Eureka的微服务网关。
重新架构了内部组件,采用插件模式。
服务发现
Eureka Discovery
抽象discovery,用来支持多种服务发现?规划中…
动态路由
负载均衡
加权轮询
基于响应时间的动态权重轮询?开发中…
简单监控
隔离降级
限流
metrics
认证安全?规划中。。。
监控页面?开发中…
架构图:
使用方法
基于Nginx和Lua module。需要安装Nginx Lua环境或者直接下载openresty编译安装。
安装和配置ngx-lua-zuul
下载代码到/path/to/nginx/lua/lib/
git clone http://github.com/tietang/ngx-lua-zuul –depth=1
例子Eureka 服务
如果没有Eureka环境,也可以编译安装本例子中的EurekaDemo服务,参考编译和运行eureka-demo服务中的相关内容。
部署dicovery例子服务:
下载代码后:
cd /path/to/ngx_l ...