【转】封装Lua for C#】的更多相关文章

原文:http://blog.csdn.net/rcfalcon/article/details/5583095 为了搞懂LUA在我们的GDEX中到底怎么用,我决定研究一下如何比较好的在WPF里封装一个基于lua的APP  framework. 今天先对Lua for C#进行了一次简单的封装. 在C#下用过Lua的人都知道,用C#实现一个函数之后和LUA绑定,需要用到Lua类的RegisterFunction方法. 在函数很少的情况下很好用,但是若需要绑定C#里成百上千个函数,则麻烦了,添加一…
http://blog.csdn.net/rcfalcon/article/details/5583095…
一,限流有哪些环节? 1,为什么要限流? 目的:通过对并发请求进行限速或者一个时间单位内的的请求进行限速,目的是保护系统可正常提供服务,避免被压力太大无法响应服务. 如果达到限制速率则可以采取预定的处理: 例如: 拒绝服务(定向到错误页面或返回错误提示信息) 排队或等待(秒杀/评论/下单) 降级(只返回兜底数据或默认数据) 2,需要应用限流的环节 防火墙:firewalld/iptables层的限流,针对每台机器 接入层:nginx的limit_req模块,对每单位时间的平均速率限流,针对某个站…
一,什么是幂等性? 1,幂等: 幂等操作:不管执行多少次,所产生的影响都和一次执行的影响相同. 幂等函数或幂等方法:可以使用相同的参数重复执行,并能获得相同的结果的函数/方法. 这些函数/方法不用担心重复执行会对系统造成改变. 2,幂等操作的一些例子: 前端重复提交相同的数据,后台只产生对应这个数据的一个相同的反应结果 发送验证码短信:应该只发一次,相同的验证短信不能多次发送. 生成订单:一个业务请求只能创建一个订单,不能重复创建相同的订单 用户付款:只能扣用户一次钱,不能重复扣费 3,实现幂等…
这是什么东西 前阵子刚刚集成xlua到项目,目的只有一个:对线上游戏C#逻辑有Bug的地方执行修复,通过考察了xlua和tolua,最终选择了xlua,原因如下: 1)项目已经到了后期,线上版本迭代了好几次,所以引入Lua的目的不是为了开发新版本模块,而是修复旧版本Bug. 2)修复Bug针对的是iOS平台,总所周知,安卓平台是可以通过更新DLL去修复的,而修复Bug直接改写C#代码肯定要比整个函数翻译为Lua来得简单,实际上最后由于xlua注入和我们项目的安卓代码加密流程冲突,我们对安卓保留了…
转: Redisson实现分布式锁 Redisson文档参考:https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95 redis是实现分布式锁的一种方式,其他还可以基于数据库,zookeeper等方式实现:这里拿出redis单说一下,redis从原理上大概有两种实现方式,要么是调用redis原生的原子性命令,要么是通过eval执行封装好的lua脚本:而从使用上来讲也有两种方式,要么自己动手实现(参考:https://www.cnb…
Unity3D游戏轻量级xlua热修复框架   一 这是什么东西 前阵子刚刚集成xlua到项目,目的只有一个:对线上游戏C#逻辑有Bug的地方执行修复,通过考察xlua和tolua,最终选择了xlua,很大部分原因是因为项目已经到了后期,线上版本迭代了好几次,所以引入Lua的目的不是为了开发新版本模块.xlua在我们的这种情况下很是适用,如xlua作者所说,用C#开发,用lua热更,xlua这套框架为我们提供了诸多便利,至少我可以说,在面临同样的情况下,你用tolua去做同样的事情是很费心的.但…
这是一个几年前写的对lua的访问封装,当时的项目仅提供了最基本的lua访问接口:调用lua函数,向lua注册标准格式的C++函数. 本来我想引进luabind,但luabind相对又过于复杂,并不是所有功能都是我需要的,并且还要为此引入庞大boost.最终还是决定 按需求编写一个简单的封装库. 首先简单列一下我的需求: 1)可以注册任意类型的C++函数到lua中 2)可以方便的调用lua函数,方便的访问lua中的表 3)可以访问lua中创建的对象,调用lua对象提供的方法 4)注册C++类型到l…
Lua本身是没有面向对象支持的,但面向对象编程在逻辑复杂的大型工程却很有用.于是很多人用Lua本身的数据结构table来模拟面向对象.最简单的一种方法是把对象的方法.成员都放到table中.如: -- file:test.lua local test = {} function test:get_x() end function test:set_x( _x ) self.x = _x end local test_module = {} function test_module.new() l…
hiredis异步接口封装并导出到Lua(金庆的专栏 2017.1)hiredis 不支持 Windows, Windows 下使用 wasppdotorg / hiredis-for-windows .Linux 下仍是 redis/hiredis.hiredis-for-windows 是以 hiredis 0.13.3 为基础移植的.hiredis-for-windows 需要稍加修正:    * 去除 inline 宏    * TCP_NODELAY 改在连接之前设置.详见其Issue…
Lua 获取随机值 --获取随机值,指定上限和下限 function getRandom(min,max) -- 接收一个整数n作为随即序列的种子 math.randomseed(os.time()) ----然后不断产生随机数 --[[ for i=1, 5 do print(math.random(100)) end]]-- return math.random(min,max) end 获取当前时间 function getNow() local nowTime = os.date("%Y…
需求:根据客户需求,可以在ngx下 通过lua做接口二次封装再次转发给用户或第三方 场景:对返回值有要求的.接口屏蔽字段.或做一些业务上的验证等 1.windows直接下载openresty 解压即可,就完成了windows下使用lua的开发环境 2.配置: a.在nginx.conf里http下配置如下代码: include mime.types; default_type application/octet-stream; lua_package_path "/lualib/?.lua;;&…
lua面向对象的一个封装,直接贴代码 --swfclass = {};local cs = {};function _class( child, base, ... )--    _.s( child );    if( cs[ child ] ) then error( "duplicate class : " .. child ) end;    local c = _G[child];    table.copy( c, base or {} );    for ii = 1,…
Lua数据库封装类型的操作 使用演示样例 lua代码: require("DB") -- 保存一个字符串(数据库中存储的数据都是以字符串的形式保存的) DB:getInstance():setString("level",level) -- 依据key(isOpenMusic)返回一个数字,第二个參数为默认返回值 local result = DB:getInstance():getNumber("isOpenMusic",1) -- 依据key…
工程结构: Player.lua: Player = {} function Player:new() local self = {} setmetatable(self, {__index = Player}) return self end Player.name = "Player" function Player:get() print("the function : get()") end return Player --[[ 两个点与一个点有什么区别呢?…
--自己封装一个Debug调试日志 Debug={} Info={} local function writeMsgToFile(filepath,msg) end function Debug.Log(...) local arg={...} local msg="["..os.date("%Y-%m-%d %X",os.time()).." debug]"--这里时间格式下面将附上,不要都大写了 for k,v in pairs(arg) d…
概述 我们总所周知对象是由属性和方法组成的,要用lua要描述一个对象,也必然要有这两个特性,属性和方法.lua的基本结构是table,所以Lua的类,其实都是table,因为它可以存储普通的变量又可以存储方法,我们利用table就可以描述一个对象的属性和方法. 对象 其实lua要模拟一个对象,关键就在于__index设置元表索引这块,它主要起到索引失败后该怎么办,如果它指向一张表,那么__index索引失败后,它会到这张表中去查找有没有你指定的函数或成员值,如果有,__index方法被调用时会返…
--[[ Packaging_KernelEngine.h 文件说明:所有对象在建立时位置是优先的,传入位置参数必须cc.p(X,Y) CurObj:表示要传入当前的对象 将3.10 lua api 放到 C:\Users\Administrator\Documents\BabeLua\Completion ***************]] -- Valid Line Number 2901 -- local Obj = require("cocos.Packaging_Kernel"…
1.移位运算基础 --与 同为1,则为1 --或 有一个为1,则为1 --非 true为 false,其余为true --异或 相同为0,不同为1 --ZZMathBit = {} function ZZMathBit.__andBit(left,right) --与 and right == ) and or end function ZZMathBit.__orBit(left, right) --或 or right == ) and or end function ZZMathBit._…
1.C# 与 LUAC#调用LUA比较简单,但LUA调用C#,有两种方法,一种是直接反射调用,但这种方法有局限性,比如性能低,在IOS平台无法使用反射,因此一般使用WARP方法,即把C#代码注册到LUA虚拟机,然后调用的时候,LUA -> C# WARP -> C# CODE参考:http://blog.csdn.net/pengdongwei/article/details/50420612 2.LUA变量Lua是动态类型语言,变量不要类型定义,只需要为变量赋值就会创建这个变量Lua 变量有…
转载自:http://cn.cocos2d-x.org/tutorial/show?id=1621 从Samples中找到CoinFlip文件夹,复制其中的 res 和 script 文件夹覆盖新建工程中的 res 和 script文件. 用player运行,游戏可正常打开. 打开main.lua function __G__TRACKBACK__(errorMessage) print("----------------------------------------") print…
Lua称为解释型语言的原因:Lua允许在运行源代码之前,先将源代码预编译为一种中间形式.区别解释型语言的主要特征是在于编译器是否是语言运行时库的一部分,即有能力执行动态生成的代码.因为Lua中有dofile函数,才可以将Lua成为一种解释型的语言.        运行Lua代码块有三种形式:      1.dofile 直接编译运行Lua外部代码块,并不返回任何结果.      2.loadfile 编译Lua外部代码块,但不会运行代码,将会以函数的形式返回编译结果.      3.loadst…
转自:http://cn.cocos2d-x.org/tutorial/show?id=1474 一.Lua堆栈 要理解Lua和C++交互,首先要理解Lua堆栈. 简单来说,Lua和C/C++语言通信的主要方法是一个无处不在的虚拟栈.栈的特点是先进后出. 在Lua中,Lua堆栈就是一个struct,堆栈索引的方式可是是正数也可以是负数,区别是:正数索引1永远表示栈底,负数索引-1永远表示栈顶.如图: lua的栈类似于以下的定义, 它是在创建lua_State的时候创建的: TValue stac…
一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市场快速变化的开发团队,以达到节省开发成本.缩短开发时间,快速适应市场变化的目的. AgileEAS.NET SOA中间件平台提供了敏捷快速开发软件工程的最佳实践,通过提供大量的基础支撑功能如IOC.ORM.SOA.分布式体系及敏捷并发开发方法所支撑的插件开发体系,以及提供了大量的实体.数据模型设计生…
lua中的table就是一种对象,但是如果直接使用仍然会存在大量的问题,如下: 1 Account = {balance = 0}2 function Account.withdraw(v)3 Account.balance = Account.balance - v4 end5 --下面是测试调用函数6 Account.withdraw(100.00) 在上面的withdraw函数内部依赖全局变量Account,一旦发生改变,将会导致withdraw不能正常工作,如: 1 a = Accoun…
最近在开发电商平台的子系统--储值卡系统,系统核心业务涉及到金额消费以及库存控制,因此为了解决建立在内存上高并发情况下的事务控制,使用了spring封装的RedisTemplate执行lua脚本进行原子性操作,确保金额消费,库存按顺序处理,解决资源争抢. 1.使用lua脚本 Redis 使用单个 Lua 解释器去运行所有脚本,并且, Redis 也保证脚本会以原子性(atomic)的方式执行:当某个脚本正在运行的时候,不会有其他脚本或 Redis 命令被执行.这和使用 MULTI / EXEC …
lua是一门简单的语言,不带类和属性封装,但可以使用lua强大的元表模拟实现: class.lua local type = type local rawset = rawset local setmetatable = setmetatable local tracebacks = setmetatable({}, {__mode = "k"}) local function class(classname, super) local cls = {} cls.classname =…
11月11日开读,到今天正好一个月. 起因是被裁员之后,发现很多公司都在使用lua编写cocos2d-x游戏,原因是上手快,技术人员比较便宜. 如果引擎封装比较好,几乎在lua里写写基本逻辑就行了,不需要懂cocos2d-x.其实lua也不需要懂太多. 只要会if ,for等基本语句就行了. 加入新公司后,看了项目的代码.这份代码是从公司另外一款已经成功上线的游戏复制来的.基本只需要在lua里写写逻辑就够了.其实这也是应该的,如果需要太多东西在C++里修改,反而是不好的设计 .Lua和C++接口…
协程和一般多线程的区别是,一般多线程由系统决定该哪个线程执行,是抢占式的,而协程是由每个线程自己决定自己什么时候不执行,并把执行权主动交给下一个线程. 协程是用户空间线程,操作系统其存在一无所知,所以需要用户自己去做调度,用来执行协作式多任务非常合适. 线程和协同程序的主要不同在于:在多处理器情况下,多线程程序同时运行多个线程:而协同程序是通过协作来完成,在任一指定时刻只有一个协同程序在运行,并且这个正在运行的协同程序只在必要时才会被挂起.这样Lua的协程就不能利用现在多核技术了. (一)Cor…
1,loadstring 编译的时候不关心词法范围:   local i = 0   f = loadstring("i = i + 1") g = function () i = i + 1 end 这个例子中, 和想象的一样g 使用局部变量i , 然而f 使用全局变量i : loadstring 总是在全局环境中编译他的串. i = f = loadstring("i = i + 1 print(i)") g = print(i) end print(f())…