gpt4 book ai didi

c++ - 将Lua状态保持在C++环境中以限制上下文切换

转载 作者:行者123 更新时间:2023-12-02 10:32:57 25 4
gpt4 key购买 nike

我在编写简单的OpenGL演示时很有趣,最近我决定在我的C++引擎中使用Lua,以便动态更改渲染,而不必在我的项目上进行重新编译。因此,我可以更轻松地调整渲染算法。但是我知道我当前的渲染更新功能可能远非高效。

目前,我正在将矩阵从C++传输到Lua,在Lua脚本中对其进行修改,然后将其发送回我的C++渲染引擎。但是,每当我从C++引擎收到更新调用时,我都会重新加载Lua脚本,并且丢失所有变量上下文。这意味着我总是从头开始,并且渲染远非平滑。我在下面包括一些代码示例以解释我在做什么。我目前正在学习C++嵌入的Lua,所以我知道我仍然没有最佳实践。

update.lua

function transform(m)
amplitude = 1.5
frequency = 500
phase = 0.0
r = {}

for i = 1, #m do
r[i] = {}
for j = 1, #m[i] do
if (i % 2) then
r[i][j] = amplitude * math.sin(m[i][j] + phase)
else
r[i][j] = -amplitude * math.sin(m[i][j] + phase)
end
phase = phase + 0.001
end
end
return r
end

-- called by c++
function update()
m = pull()
r = transform(m)
push(r)
end

matrix.cpp
// pull matrix from lua point of view
static int pull(lua_State * _L)
{
_push(_L, &_m);

return 1;
}

// push matrix from lua point of view
static int push(lua_State * _L)
{
// get number of arguments
int n = lua_gettop(_L);

if(1 == n) {
_pull(_L, 1, &_m);
}

return 1;
}

void matrix::load_file(char * file, char * function)
{
int status;

// load the file containing the script we are going to run
status = luaL_loadfile(_L, file);
switch (status) {
case LUA_OK:
break;
case LUA_ERRFILE:
std::cout << "LUA_ERRFILE: " << lua_error(_L) << std::endl;
break;
case LUA_ERRSYNTAX:
std::cout << "LUA_ERRSYNTAX: " << lua_error(_L) << std::endl;
break;
default:
std::cout << lua_error(_L) << std::endl;
}

lua_getglobal(_L, function);
status = lua_pcall(_L, 1, 1, 0);
if (status != LUA_OK) {
std::cout << "error running file" << lua_error(_L) << std::endl;
}
}

void matrix::update()
{
load_file("lua/update.lua", "update");
}

我在调用update()函数时正在考虑 passing some arguments,但我想知道从C++到Lua再回到C++的方法是否正确和有效。特别是考虑到我可能会在Lua中转移和修改巨大矩阵这一事实。我可能缺少一些嵌入式Lua知识,无法在加载脚本时保留上下文。您对我将如何改进代码有一些一般性建议?我知道我目前的方法过于复杂。

最佳答案

一个快速的解决方案是仅在自上一帧以来对其进行过修改的情况下加载文件:

static time_t last_modified = 0;
struct stat sbuf;
stat(file, &sbuf);
if (sbuf.st_mtime > last_modified) {
last_modified = sbuf.st_mtime;
status = luaL_loadfile(_L, file);
// etc
}

// Now call the function
lua_getglobal(_L, function);
status = lua_pcall(_L, 1, 1, 0);

关于c++ - 将Lua状态保持在C++环境中以限制上下文切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61630145/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com