lua转让C++书面DLL达到“热更新”
原创作品,请注明出处转载CSDN:http://blog.csdn.net/relar/article/details/38084689
开发游戏server往往有“热更新”的需求,就是在不停止服务程序的情况下。对服务程序进行升级。
这里採用lua脚本桥接C++的模式。程序主框架用C++,程序的业务逻辑也是C++(详细的是C++写的DLL),这两者之间用LUA脚本语言进行桥接。当程序执行时,仅仅要改变LUA脚本,即能够选择使用不同的DLL。以实现业务逻辑的升级更新。
上演示代码,代码分为三部分,第一部分是主程序:
//本例演示了lua调用DLL #include "stdafx.h"
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <conio.h>
#include "include\lua.hpp" int _tmain(int argc, _TCHAR* argv[])
{ int global_var1 = 0;
printf("这个程序演示Lua调用C++的Dll:\n");
lua_State *pLuaState = luaL_newstate(); //也能够用lua_open();
luaL_openlibs(pLuaState); if (luaL_dofile(pLuaState, "main2.lua"))// 载入脚本文件
{
printf("dofile error.\n");
}
_getch();
if (luaL_dofile(pLuaState, "main2.lua"))// 第二次载入脚本文件
{
printf("dofile error.\n");
}
_getch();
lua_close(pLuaState); return 0;
}
第二部分是DLL。我的project名称是Func1,编译出来的自然是Func1.dll
#include "my.h" int GameLogic1(lua_State *L)
{
int n = lua_gettop(L);
double sum = 0;
int i; for (i = 1; i <= n; i++)
{ sum += lua_tonumber(L, i);
} lua_pushnumber(L, sum / n); lua_pushnumber(L, sum); return 2;
}
const struct luaL_Reg Func1lib[] = {
{ "GameLogic1", GameLogic1 },
{ NULL, NULL }
}; int luaopen_Func1lib(lua_State* L)
{
luaL_openlib(L, "Func1lib", Func1lib, 0);
return 1;
}
当中my.h的代码例如以下:
#include "include\lua.hpp" #pragma comment(lib, "lua5.1.lib") #if defined(_WIN32)
extern "C" _declspec(dllexport) int luaopen_Func1lib(lua_State* L); #else
extern "C" int luaopen_Func1lib(lua_State* L);
#endif
注意,上面extern "C"这几句曾让我浪费了不少时间。由于DLL是用C++写的。而LUA是用C写的。所以一定要用extern "C"语句。
以下是LUA脚本:
local testlib = package.loadlib("E://Func1.dll", "luaopen_Func1lib")
print(testlib)--, "Can not open testlib.")
if(testlib)then
testlib(); --调用DLL中抛出函数
a,b=Func1lib.GameLogic1(6,6)
print("average:",a,"sum:",b);
a,b=Func1lib.GameLogic2(3,6)
print("average:",a,"sum:",b);
else
print("Error")
end
这个脚本也让我浪费了非常长时间,它有两个陷阱,第一。它一定要写DLL的绝对路径,第二,这个脚本在LUA命令行中无法执行,仅仅有在C++程序中被调用。不注意这两点会让你疯掉。
另外我依照Func1.dll又写一个Func2.dll。内容稍有不同(这里就不必上代码了哈),演示的时候主程序执行了第一次载入脚本后会等待用户输入随意键。此时能够把脚本改为使用Func2.dll。再输入随意键让程序继续执行。业务逻辑就改了。
还有人是把业务逻辑以纯LUA实现,可是LUA自身功能有限。它天生就是用来打电话或C/C++呼叫。
版权声明:本文博主原创文章,博客,未经同意不得转载。
lua转让C++书面DLL达到“热更新”的更多相关文章
- 客户端热更新框架之UI热更框架设计(上)
什么是热更新,为什么需要热更新? 热更新是目前各大手游等众多App常用的更新方式.简单来说就是在用户通过App Store下载App之后,打开App时遇到的即时更新.对于手游客户端来 ...
- unity游戏热更新
链接:https://pan.baidu.com/s/1ggWP0OF 第 1 章 : 热更新技术学习介绍 课时1:101-热更新技术学习介绍 11:55 什么是热更新? 举例来说 游戏上线后,玩家下 ...
- Unity3D热更新之LuaFramework篇[10]--总结篇
背景 19年年初的时候,进到一家新单位,公司正准备将现有的游戏做成支持热更的版本.于是寻找热更方案的任务就落在了我头上. 经过搜索了解,能做Unity热更的方案是有好几种,但是要么不够成熟,要么不支持 ...
- iOS热更新-8种实现方式
一.JSPatch 热更新时,从服务器拉去js脚本.理论上可以修改和新建所有的模块,但是不建议这样做. 建议 用来做紧急的小需求和 修复严重的线上bug. 二.lua脚本 比如: wax.热更新时,从 ...
- Unity实现c#热更新方案探究(二)
转载请标明出处:http://www.cnblogs.com/zblade/ 一.IOS对DLL热更新的禁止 紧接上文,继续对C#热更新的研究.上文中,已经说了如何基于appDomain来实现对DLL ...
- Unity实现c#热更新方案探究(一)
转载请标明出处:http://www.cnblogs.com/zblade/ 最近研究了一下如何在unity中实现c#的热更新,对于整个DLL热更新的过程和方案有一个初步的了解,这儿就写下来,便于后续 ...
- Unity官方发布热更新方案性能对照
孙广东 2016.3.11 Unity应用的iOS热更新 作者:丁治宇 Unity TechnologiesChina Agenda • 什么是热更新 • 为何要热更新 • 怎样在iOS 上对 ...
- Unity应用的iOS热更新
Unity应用的iOS热更新 作者:丁治宇 Unity TechnologiesChina Agenda • 什么是热更新 • 为何要热更新 • 如何在iOS 上对Unity 应用进行热更新 • ...
- unity热更新方案对比
Unity应用的iOS热更新 • 什么是热更新 • 为何要热更新 • 怎样在iOS 上对Unity 应用进行热更新 • 支持Unity iOS 热更新的各种Lua 插件的对照 什么是热更新 • ...
随机推荐
- 第4周 页面限制8060 bytes
原文:第4周 页面限制8060 bytes 恭喜您!在你面前就只剩下几页了,然后你就可以完成第1个月的SQL Server性能调优培训了.今天我将讲下页的一些限制,还有为什么你会喜欢这些限制,同时也会 ...
- 栈实现java
栈是一种“先去后出”的抽象的数据结构.例如:我们在洗盘子的时候,洗完一个盘子,将其放在一摞盘子的最上面,但我们全部洗完后,要是有盘子时,我们会先从最上面的盘子开始使用,这种例子就像栈的数据结构一样,先 ...
- Centos memcached的php拓展 管理界面
确定已安装apache 一.安装php5 1.安装libxml2 tar zxvf libxml2-.tar.gz cd libxml2- ./configure --prefix=/usr/loca ...
- 【原创】UVAOJ水题10025解题报告
首先是原题,转自UVAOJ The ? 1 ? 2 ? ... ? n = k problem The problem Given the following formula, one can s ...
- poj2386Lake Counting
题意是这种.给你一个N*M的矩形图.这个图由两个东西组成.'.'和'W', W代表这个地方有水. .代表这个地方没水. 假设一个有水的地方它的上下左右,左上,坐下.右上.右下也有水,那么 就看成它们连 ...
- OCP解决问题053-16 MEMORY_TARGET
16.Setting which of the following initialization parameters enables Automatic Memory Management? A. ...
- 用Jstack跟踪Cpu占用率的Java线程(转)
以下方法在centOS下执行通过:1.先定位占用cpu高的进程 top 2.使用以下命令 ps p 14766 -L -o pcpu,pid,tid,time,tname,stat,psr | sor ...
- CSDN 夏令营课程 项目分析
主题如以下: 正确改动后的程序: #include <iostream.h> //using namespace std; class BASE { char c; public: BAS ...
- uva133 The Dole Queue ( 约瑟夫环的模拟)
题目链接: 啊哈哈,选我选我 思路是: 相当于模拟约瑟夫环,仅仅只是是从顺逆时针同一时候进行的,然后就是顺逆时针走能够编写一个函数,仅仅只是是走的方向的标志变量相反..还有就是为了(pos+flag+ ...
- SELECT 场 FROM 表 WHERE 字段 Like 条件
间有关的条件,SQL它提供了四种匹配模式: 1.%: 表示随意0个或多个字符.可匹配随意类型和长度的字符.有些情况下若是中文,请使用两个百分号(%%)表示. 比方 SELECT * FROM [use ...