Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

防止uclass被gc时,误清在mark和sweeep之间新建的同名uclass信息 #184

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

kimixuchen
Copy link
Contributor

你好,实际使用中有以下一种特殊情况
第一步: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等照清,顶多之后重新注册一遍,不知合不合适。

@dlwcry
Copy link

dlwcry commented Dec 10, 2020

我怀疑我们项目也有出现这样的随机性错误。
崩溃时就是出现在 GetField 中,找到空的ClassDesc造成的。

@junfind
Copy link

junfind commented Jan 4, 2021

我也遇到了这个情况,每次触发Asserstion之前,都有这些日志: Class/ScriptStruct XXX has been GCed by engine!!!,而且步骤就是上面说的

@jarjin
Copy link

jarjin commented Jan 26, 2021

Class/ScriptStruct XXX has been GCed by engine!!!是由于在相关Close的时候,没有调用Destroy,不对称释放导致的。基本都可以通过正常解绑消除掉这些警告。

@Bairuo
Copy link

Bairuo commented Apr 7, 2021

你好,实际使用中有以下一种特殊情况
第一步: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等照清,顶多之后重新注册一遍,不知合不合适。

我们也遇见了这个问题,特别在手机端会偶现,感谢提示了

@tary
Copy link

tary commented Apr 10, 2021

C++定义的类可以保证不重名, 但是蓝图没有这个限制, 如果不能保证名字和类是一一对应的会有歧义, 我觉得应该再注册的时候就顺手把之前注册重名的ClassDesc读出来清理掉, 顺便打印一下. 重名的文件重新命名.

我测试了处于不同目录的两个同名的UI蓝图控件放在同一个UI上, 在Lua内会被识别为最后一个注册的
这种同命不同类的出现这个问题很容易触发, 同名同类重新注册是清理了也不影响调用

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants