防止uclass被gc时,误清在mark和sweeep之间新建的同名uclass信息#184
防止uclass被gc时,误清在mark和sweeep之间新建的同名uclass信息#184kimixuchen wants to merge 1 commit intoTencent:masterfrom kimixuchen:UnLua-fs
Conversation
|
我怀疑我们项目也有出现这样的随机性错误。 |
|
我也遇到了这个情况,每次触发Asserstion之前,都有这些日志: Class/ScriptStruct XXX has been GCed by engine!!!,而且步骤就是上面说的 |
|
Class/ScriptStruct XXX has been GCed by engine!!!是由于在相关Close的时候,没有调用Destroy,不对称释放导致的。基本都可以通过正常解绑消除掉这些警告。 |
我们也遇见了这个问题,特别在手机端会偶现,感谢提示了 |
|
C++定义的类可以保证不重名, 但是蓝图没有这个限制, 如果不能保证名字和类是一一对应的会有歧义, 我觉得应该再注册的时候就顺手把之前注册重名的ClassDesc读出来清理掉, 顺便打印一下. 重名的文件重新命名. 我测试了处于不同目录的两个同名的UI蓝图控件放在同一个UI上, 在Lua内会被识别为最后一个注册的 |
你好,实际使用中有以下一种特殊情况
第一步:UE开始GC,执行mark,把uclass作为垃圾,标记为unreachable
第二步:新的同名uclass对象被创建,注册到unlua,对应的Actor被push到lua中
第三步:UE执行分帧清理第一步GC扫描到的垃圾,垃圾uclass删除,Name2Classes被清空。但此时Name2Classes存储的value为新的uclass,并不是垃圾uclass
第四步:lua中新uclass对应Actor执行到GetField,会因为Name2Classes没有Name而check失败
我的想法是只在清Name2Classes时判断,其他ClassMetaTable等照清,顶多之后重新注册一遍,不知合不合适。