您的位置:首页 > 编程语言 > Lua

ToLua学习笔记(三) Example 03 CallLuaFunction

2016-07-06 11:56 483 查看

ToLua学习笔记(三) Example 03 CallLuaFunction

转载请注明出处四川包邮

ToLua学习笔记三 Example 03 CallLuaFunction
代码

GetFunction

两种调用方式的区别
为什么这两种调用方式会有这种区别

这一篇文章会讲解如何调用Lua中的函数

代码

//#define TEST_GC
using UnityEngine;
using System.Collections;
using LuaInterface;
using System;

public class CallLuaFunction : MonoBehaviour
{
private string script =
@"  function luaFunc(num)
return num + 1
end

test = {}
test.luaFunc = luaFunc
";

LuaFunction func = null;
LuaState lua = null;
string tips = null;

void Start ()
{
#if !TEST_GC
#if UNITY_5
Application.logMessageReceived += ShowTips;
#else
Application.RegisterLogCallback(ShowTips);
#endif
#endif
lua = new LuaState();
lua.Start();
lua.DoString(script);

//Get the function object
func = lua.GetFunction("test.luaFunc");

if (func != null)
{
//有gc alloc
object[] r = func.Call(123456);
Debugger.Log("generic call return: {0}", r[0]);

// no gc alloc
int num = CallFunc();
Debugger.Log("expansion call return: {0}", num);
}

lua.CheckTop();
}

void ShowTips(string msg, string stackTrace, LogType type)
{
tips += msg;
tips += "\r\n";
}

#if !TEST_GC
void OnGUI()
{
GUI.Label(new Rect(Screen.width / 2 - 200, Screen.height / 2 - 150, 400, 300), tips);
}
#endif

void OnDestroy()
{
if (func != null)
{
func.Dispose();
func = null;
}

lua.Dispose();
lua = null;

#if !TEST_GC
#if UNITY_5
Application.logMessageReceived -= ShowTips;
#else
Application.RegisterLogCallback(null);
#endif
#endif
}

int CallFunc()
{
func.BeginPCall();
func.Push(123456);
func.PCall();
int num = (int)func.CheckNumber();
func.EndPCall();
return num;
}

//在profiler中查看gc alloc
#if TEST_GC
void Update ()
{
func.Call(123456);
//CallFunc();
}
#endif
}


GetFunction

通过GetFunction可以获取Lua中的函数

// Get the function object
func = lua.GetFunction("test.luaFunc");


两种调用方式的区别

// 会有gc alloc
func.Call(123456);

// 没有gc alloc
int CallFunc()
{
func.BeginPCall();
func.Push(123456);
func.PCall();
int num = (int)func.CheckNumber();
func.EndPCall();
return num;
}


为什么这两种调用方式会有这种区别

引用官方文档中的原文

(1)有gc alloc : func.Call(123456) 之所以有gc内存分配,原因在于Call函数参数类型是object[] Call(params object[] args),为啥会有这个问题,就是引擎的问题了。但是对于tolua#来说也没有找到可变参数的替代类型,所以先用着吧。

(2)no gc alloc:这个方式没有gc内存分配,原因就是舍去了params object[] args,但是写法有些麻烦,所有的参数都要func.Push(123456);进去后,再执行func.PCall(); 调用,然后再通过num = (int)func.CheckNumber();拿到lua代码执行的返回值。

至于选择那种?是选择方便,还是高效,大家自己选择吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  lua Unity ToLua