显示下一条  |  关闭

小洪

引刀成一快,不负少年头

 
 
 
 
 
 
 
 

Lua在武侠世界中的应用

2012-3-24 20:59:23 阅读10 评论0 242012/03 Mar24

Lua应用于游戏之中早不是新鲜事情,但对于游戏新人的我,却充满好奇。正好武侠世界嵌入Lua,重点阅读了相关部分。

在阅读之前主要对下面个问题比较好奇:

1. Lua跟C++如何混合编程?

2. Lua主要用来做些什么事情?

云风在《C/C++ 与 Lua 的混合编程》中提到:嵌入还是扩展,这是一个问题。在武侠中,是采取嵌入的方式。通过LuaPlus将Lua嵌入到C++中。在C++中调用封装好的lua c api直接执行对应的Lua脚本。而为了方便Lua中调用C++,C++层做了大量的注册操作。由于所有的注册都是直接注入到Lua的global中,所以,我们只需要启动武侠客户端,在LuaObject LuaState::GetGlobals()实现处下一断点就可以观察所有的注册操作。按照代码运行顺序,为一下几个步骤:

1. LuaPlus初始化虚拟机时注册的一些东西

ScriptFunctionsRegister( this );

GetGlobals().Register("LuaDumpGlobals", LS_LuaDumpGlobals);

作者  | 2012-3-24 20:59:23 | 阅读(10) |评论(0) | 阅读全文>>

Lua学习小记

2012-2-29 1:14:04 阅读5 评论0 292012/02 Feb29

作为一名游戏开发人员,都不能免俗地想打造一个自己的游戏引擎。现如今,游戏引擎不支持脚本引擎好像都说不过去。虽然Python也可作为游戏脚本,但对于手机游戏开发,嵌入这么个脚本引擎未免显得太重了写。所以,也开始折腾了起Lua的东西。

这里有有些参考资料,总结得不错,供大家参考。

作为游戏中的脚本引擎,其实关键是要弄明白c/c++和Lua之间如何互相调用(即弄清楚Lua C API)。大致弄清楚下面几个问题,就好说了。

c-->lua

1. c执行lua脚本

2. c访问lua中的变量

3. c调用lua中的函数

lua-->c

1. 把c中的函数注册到lua中去

2. 把c中的变量扔到lua中去。

网上有不少的相关代码,可以去查看。比如这里,还有这里

这些代码初次读起来非常痛苦。重点理解下面几个概念:

1.在Lua中,基本数据:nil, boolean, number, string, userdata, function, thread, and table。都是有一个结构来表示。函数也是一种数据,可以被复制和传递等。

2.运行时一般有一个lua_state,作为一个运行状态,存储了当前的所有的全局变量(不仅仅是数据,函数也有)和栈。

3.Lua和c之间的交互是通过对栈进行操作来实现的 lua的栈类似于以下的定义, 它是在创建lua_State的时候创建的:

TValue stack[max_stack_len]  // 欲知内情可以查 lstate.c 的stack_init函数

作者  | 2012-2-29 1:14:04 | 阅读(5) |评论(0) | 阅读全文>>

libvirt 错误FAQ

2011-7-29 13:24:10 阅读36 评论0 292011/07 July29

libvirt 错误FAQ

【Q】: error lxcControllerRun:686 : Cannot unshare mount namespace: Function not implemented

【A】:

【Q】: "start vm1" in virsh, error: Failed to add veth0 device to virbr0: No such device

【A】:

【Q】: "net-start" defualt in virsh error: Cannot find 'dnsmasq' in path: No such file or directory

【A】:

【Q】: "start suse" in virsh error : lxcSetupInterfaces:1108 : Failed to add veth0 device to virbr0: No such device

/usr/local/sbin/brctl addbr virbr0

【Q】:hack 的时候出现编译错误:../src/.libs/libvirt_driver_lxc.a(libvirt_driver_lxc_la-lxc_driver.o): In function `lxcSetSchedulerParameters':

lxc/lxc_driver.c:2326: undefined reference to `virCgroupSetCpuSet'

作者  | 2011-7-29 13:24:10 | 阅读(36) |评论(0) | 阅读全文>>

libvirt hooks 机制

2011-7-29 13:20:33 阅读26 评论0 292011/07 July29

libvirt hooks 机制

参考:http://libvirt.org/hooks.html

说明:

libvirt从0.8.0开始,支持某些特定行为触发用户自定义搅拌的机制。目前脚本hook,主要在下面的一些行为产生是触发:

1. libvirt daemon 启动,停止和重新reload时

2. qemu guest 启动或者停止时

3. lxc guest 启动或者停止时

脚本位置:

$SYSCONFDIR/libvirt/hooks/。 一般在 /etc/libvirt/hooks/

定义在src/util/hooks.c:48

#define LIBVIRT_HOOK_DIR SYSCONFDIR "/libvirt/hooks"

脚本的名字:

/etc/libvirt/hooks/daemon

/etc/libvirt/hooks/qemu

/etc/libvirt/hooks/lxc

脚本参数:

lxc中:

/etc/libvirt/hooks/lxc guest_name start begin -

/etc/libvirt/hooks/lxc guest_name stopped end -

作者  | 2011-7-29 13:20:33 | 阅读(26) |评论(0) | 阅读全文>>

libvirt中API的扩展

2011-7-29 13:17:43 阅读45 评论0 292011/07 July29

API扩展

步骤

1. 定义public API

docs/libvirt-api.xml 语言绑定的时候需要用到(TODO)

docs/schemas/domain.rng

docs/formatdomain.html.in

include/libvirt/libvirt.h.in  (非常重要)

src/libvirt_public.syms(这个是干嘛用的?没看出来, 非常重要,不然会出现变异错误)

2. 定义internal API

在src/driver.h 中增加对于的接口函数,并把对于的接口加入到其他需要支持的drivers中区。

3. 实现public API

src/libvirt.c 中实现总的,其他drivers实现具体的及细节,如:

4. 实现remote protocol

rpc修改,涉及到三处改动:

1) 修改协议:src/remote/remote_protocol.x。 修改完之后需要make -C src rpcgen生产对于的rpc相关文件

(1) 为每个新接口定义两个结构体。一个用来描述参数的,一个用来描述返回值

(2) add values to the remote_procedure enum for each new function added to the API.

然后运行 make rpcgen.生成新的下列文件:

作者  | 2011-7-29 13:17:43 | 阅读(45) |评论(0) | 阅读全文>>

libvirt中CPU和内存的细粒度管理机制

2011-7-29 13:15:59 阅读32 评论0 292011/07 July29

内存

struct _virDomainDef {

...

struct {

        unsigned long max_balloon;  

        unsigned long cur_balloon;

unsigned long hugepage_backed;

        unsigned long hard_limit;

        unsigned long soft_limit;

        unsigned long min_guarantee;

        unsigned long swap_hard_limit;

    } mem;

...

}

选项:

1. hard_limit:  ---> memory.limit_in_bytes

it represents the maximum memory the guest can use.

guest能使用的最大内存

2. soft_limit  ---> memory.soft_limit_in_bytes

it represents the memory upper limit enforced during memory contention.

内存紧张时的保证。

比如:1G内存的物理主机,我们分配两个虚拟机器,设置hard_limit均为600M。但这样如果在资源紧张时就傻逼了。

需要设置soft_limit=500M,保证最多只有这么多内存可被用。

作者  | 2011-7-29 13:15:59 | 阅读(32) |评论(0) | 阅读全文>>

测试lxc虚拟机CPU资源分配

2011-7-13 16:34:44 阅读42 评论0 132011/07 July13

测试虚拟机CPU资源分配

说明:

本测试主要想验证cgroup技术对于cpu资源的分配和占用的情况,验证一些理论上的想法。

测试环境:

物理机:

CPU 8核 Intel(R) Xeon(R) CPU X3440  @ 2.53GHz

内存 8G

虚拟机:domain1, domain2. 二者的cpu资源通过管理平台动态调整

测试方法:

我们在domain1上跑apache webserver,在另外一台物理主机上通过ab,测试apache的性能参数,通过这个观测虚拟机的性能。或者跑死循环,对比cpu的情况

测试场景:

1. domain1独占1个cpu

压力测试:./ab  -c 100 -n 50000 -t 10000 http://10.1.152.69/

测试结果:

1) 只占用cgroup中对应cpu.cpuset指定的cpu

2) 平均请求数:9100 req/s

2. domain1独占2个cpu

压力测试:./ab  -c 100 -n 50000 -t 10000 http://10.1.152.69/

作者  | 2011-7-13 16:34:44 | 阅读(42) |评论(0) | 阅读全文>>

如何将gbk版本discuz转为化为utf-8版本?

2011-5-31 21:51:28 阅读19 评论0 312011/05 May31

面临的问题是:现有的discuz是gbk版本的,数据库采用的latin1,围绕其的ucenter,uchome均采用这种编码格式。由于业务出现其他变动,不得不将整个转为化utf-8编码的。包括程序和底层数据库。

初看挺简单的问题。数据库大不了把数据通过mysqldump出来,然后转码,  最后直接mysql <**.sql 导入即可。程序下载一个新的编码软件安装下就可以。

针对第一个问题,网上有很多的解决方案,典型的列举几处:

http://www.oicto.com/2011/05/mysql-latin1-utf-8/

http://en.gentoo-wiki.com/wiki/Convert_latin1_to_UTF-8_in_MySQL

尝试了他们的方法。由于数据有点大,2G多一点,中间会出现各种乌七八糟的错误。类似于某个命令有误或者辛辛苦苦转入结果却是乱码,非常让人揪心。

最后只好写了一个python的小脚本,来做这个事情。非常好使。Python在干这种脏活方面非常擅长。而且,在编码处理方面也很清晰。可以很容易看出文件的编码以及在不同的编码中进行转换。具体的代码见

作者  | 2011-5-31 21:51:28 | 阅读(19) |评论(0) | 阅读全文>>

虚拟机测试框架

2011-3-17 13:15:22 阅读63 评论0 172011/03 Mar17

虚拟机的解决方案各有千秋,在技术选型上,就需要好好进行测试,在这里大致给出一个测试框架出来,希望对大家在技术选型的时候有所帮助

1. 系统性能测试

1.1 综合测试

采用UnixBench,具体参考http:// code.google.com/p/byte-unixbench/

是一个系统基准测试工具,不是CPU、RAM或者磁盘基准测试工具。 结果不仅依靠您的硬件,还要依靠您的操作系统,库甚至编译器。主要测试参数如下:

Dhrystone

该测试用于衡量字符串操作性能,不涉及浮点运算。该测试由Reinhold Weicker在1984年开发,它很大程度上受到软硬件设计、编译器和连接器参数、代码优化、缓存和整型类型的影响。

Whetstone

该测试用于衡量浮点运算的效率和速度。测试由多个科学计算混合而成,其中的C程序包括sin、cons、sqrt、exp和log,以及整数和浮点数运算、数组操作、条件判断和过程调用,同时测试整数和浮点运算性能。

Execl Throughput

该测试用于衡量每秒钟调用execl()的次数。execl()是exec函数簇的一部分,它用一个新的进程映像替换当前的进程映像。它和许多其他类似的函数都用作execve()的前端。

File Copy

该测试用于衡量文件操作性能。它从文件中读取或写入不同大小的buffer,并且测试一定时间内(默认10秒)文件的读写和复制性能。

作者  | 2011-3-17 13:15:22 | 阅读(63) |评论(0) | 阅读全文>>

Libvirt介绍

2011-3-17 13:09:06 阅读313 评论0 172011/03 Mar17

虚拟云实现的三部曲:虚拟化技术实现--<虚拟机管理--<集群资源管理(云管理)。各种不同的虚拟化技术都提供了基本的管理工具。比如,启动,停用,配置,连接控制台等。这样在构建云管理的时候就存在两个问题

作者  | 2011-3-17 13:09:06 | 阅读(313) |评论(0) | 阅读全文>>

查看所有日志>>

 
 
 
 
 
 

日志分类

 
 
日志分类列表加载中...
 
 
 
 
 
 
 
日志评论
评论列表加载中...
 
 
 
 
 
 
 
列表加载中...
 
 
 
 
 
 我要留言
 
 
 
留言列表加载中...
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2012

   
创建博客 登录  
 关注