Tangxinwei
Tangxinwei
这个其实需要自己在ts层有个ui的框架,umg和actor不太一样,umg只会destruct,真实的gc需要依赖没有引用关系,只要ts里面还持有这个umg,就会出问题。简单一点的解决方案,在destruct的时候延迟一帧markpendingkill(list的重排也会触发)。复杂一点的话,就是umg的uobject不要直接暴露给外部,而是ui框架层持有,destruct的时候,ui框架释放引用。
简单看了下代码 1. destruct拼错了 2. mixin的时候应该objectTakeByNative为true(不过即便是false,只要正常清理了,也不会泄露,只是设置为true更好) 然后可以通过obj refs 配合inspector看看uobject在ts里面的引用链,这样方便确认是puerts层的引用没释放,还是自己的ts引用没释放
你这个里面显示的是uclass的引用链,能不能显示下uobject的。这个是打包之后的吗?如果是editor的话,好像uclass是不会回收的
还有就是ts的gc不一定非常快,你要连着inspector,手动强行gc一次ue和v8
我们测试了一下 开启指针压缩后,如果不打开sandbox,对于全部的ArrayBuffer都会泄露,不仅仅是cpp里面的bindstruct,还包括脚本的pb里面创建的arraybuffer之类的。泄露堆栈是ExternalPointerTable里面的entry,因为该table相关的gc调用,被sandbox相关的宏所包含了。 打开sandbox后,泄露解除,但是需要额外的50-100M的空间进行gc,所以指针压缩的内存优势几乎被抹平了。同时sandbox对性能影响其实蛮大的,我们观测到了显著的性能降低