Open interlyx opened 4 years ago
如果没有开UBER_GRAPH_PERSISTENT_FRAME宏,也一样会有问题。Frame如果是!bUsePersistentFrame,走alloc也一样有可能用一个旧的被用过的内存地址。还是有比较大的问题
@interlyx 如果方便的话能不能把你那会产生问题的代码贴出来看下?
太久了。环境不太好重建了。目前我们只能关闭CacheScriptContainer的优化。正常要做个类似DeleteScriptCache的操作才能保证缓存不混乱。
此外我们发现unlua不支持嵌套调用CallUE函数,比如你可以试试在文本框的OnTextChanged函数中执行SetText,就会产生崩溃。param会被多次destory。后面查了很久发现是unlua的UBER_GRAPH_PERSISTENT_FRAME的优化有bug,我们也关闭了,感觉最好通过一个什么内存池来进行优化。
@rowechien
CacheScriptContainer的我找个时间尝试复现下
@rowechien "Frame如果是!bUsePersistentFrame,走alloc也一样有可能用一个旧的被用过的内存地址。" 这个问题我这里现在可以稳定复现,具体步骤为: 1、在bp里加两个方法,第一个方法参数类型为FVector,第二个方法参数类型为FRotator 2、然后在Lua里实现这两个方法,打印参数值 3、 在bp里同一帧先后调用这两个方法 结果:第二个被调用的方法的参数类型是第一个被调用方法的参数类型
因为目前unlua是用ue4反射调用的stack.local指针加上一个value的偏移来做CacheScriptContainer中Map的key值,stack.local指针如果开了UBER_GRAPH_PERSISTENT_FRAME宏,会用一个持久化的内存来重复使用,这会导致key值所采用的内存地址被复用,产生两次完全不同的调用用了同个key值的情况,这样缓存就异常了。会导致内存异常崩溃。
目前我的解决方法是只能先关闭unlua里的CacheScriptContainer缓存。最好还是要支持缓存无效的处理 @rowechien