我在.NET 4.6下使用MoonSharp(1.6.0,刚更新,在它之前遇到了问题)。我有以下C#代码:
public class LuaCore {
public static Script script = new Script();
public static DynValue Call(string func)
{
return script.DoString(func);
}
}
似乎只要我调用LuaCore.Call("any code")
,程序就会使用额外的~1.5千字节。这也发生在any code
为stuff = nil
,因此"任何代码"。
当每秒调用约3500次时,每五秒使用一次额外的25兆字节,每秒呼叫取决于机器的功率。由于每次更新都会使用多次调用,因此程序的内存使用量也会增加得更快(测试过)。 5分钟后,我得到一个OutOfMemoryException(使用了1.4GB)
我使用1.5GB内存的应用程序拍摄了堆的快照。似乎解释器正在存储被调用的每个源代码,或者看起来像VS的诊断工具。
为什么MoonSharp会在每次调用时存储那么多数据?
答案 0 :(得分:1)
简单回答:您(可能)正在为您要执行的操作调用错误的API。 DoString在指定的Script上下文中加载指定的代码并运行它。如果您反复传递相同的代码,则只需加载越来越多的副本。
所以有两种选择,取决于你想要达到的目标:
Script.RunString(code)
- 它是一个静态方法,并且不会保留从一次运行到另一次运行的任何状态LuaCore.Call
一遍又一遍地调用相同的脚本:一次调用DynValue ret = script.LoadString(code)
,然后反复调用script.Call(ret)
。 希望这有帮助。