Tencent / UnLua

A feature-rich, easy-learning and highly optimized Lua scripting plugin for UE.
Other
2.28k stars 619 forks source link

CacheScriptContainer还是有比较严重的问题,目前的实现会导致cache取到错误的值 #106

Open interlyx opened 4 years ago

interlyx commented 4 years ago

因为目前unlua是用ue4反射调用的stack.local指针加上一个value的偏移来做CacheScriptContainer中Map的key值,stack.local指针如果开了UBER_GRAPH_PERSISTENT_FRAME宏,会用一个持久化的内存来重复使用,这会导致key值所采用的内存地址被复用,产生两次完全不同的调用用了同个key值的情况,这样缓存就异常了。会导致内存异常崩溃。

目前我的解决方法是只能先关闭unlua里的CacheScriptContainer缓存。最好还是要支持缓存无效的处理 @rowechien

interlyx commented 4 years ago

如果没有开UBER_GRAPH_PERSISTENT_FRAME宏,也一样会有问题。Frame如果是!bUsePersistentFrame,走alloc也一样有可能用一个旧的被用过的内存地址。还是有比较大的问题

interlyx commented 4 years ago

image

rowechien commented 4 years ago

@interlyx 如果方便的话能不能把你那会产生问题的代码贴出来看下?

interlyx commented 4 years ago

太久了。环境不太好重建了。目前我们只能关闭CacheScriptContainer的优化。正常要做个类似DeleteScriptCache的操作才能保证缓存不混乱。

此外我们发现unlua不支持嵌套调用CallUE函数,比如你可以试试在文本框的OnTextChanged函数中执行SetText,就会产生崩溃。param会被多次destory。后面查了很久发现是unlua的UBER_GRAPH_PERSISTENT_FRAME的优化有bug,我们也关闭了,感觉最好通过一个什么内存池来进行优化。

interlyx commented 4 years ago

@rowechien

rowechien commented 4 years ago

@interlyx 递归调用UFunction确实有问题,bfabb2b已经修正了。 至于CacheScriptContainer的问题,我不是很理解你的情况,USE_UBER_GRAPH_PERSISTENT_FRAME在引擎内默认应该是开启的,我本地没有发现过crash。另外,556a5cd 这个commit对容器的处理做了些修改,你可以试试。 这个issue我不关,还有问题继续在这里沟通。

interlyx commented 4 years ago

CacheScriptContainer的我找个时间尝试复现下

sunchunyue commented 4 years ago

@rowechien "Frame如果是!bUsePersistentFrame,走alloc也一样有可能用一个旧的被用过的内存地址。" 这个问题我这里现在可以稳定复现,具体步骤为: 1、在bp里加两个方法,第一个方法参数类型为FVector,第二个方法参数类型为FRotator 2、然后在Lua里实现这两个方法,打印参数值 3、 在bp里同一帧先后调用这两个方法 结果:第二个被调用的方法的参数类型是第一个被调用方法的参数类型