puerts
puerts copied to clipboard
【ue4】切换场景时,上一个场景资源未释放占用着内存
测试:
步骤一:按一下方式加载窗口且在定时器里销毁和转换场景
步骤二: 当切换到空场景时,通过命令:MemoReport -full 打印出内存信息
发现WBP_Memory_1_C类对象还存在,并且窗口里的一个按钮图片资源还存在,并未在切换场景后销毁
对比测试,如果使用纯蓝图的话,在切换场景后,WBP_Memory_1_C类对象会被销毁,并且窗口的资源也会被释放
猜测可能:通过UE.Class.Load加载的class对象没有被正确的释放掉,虽然窗口从视口中移除了,但是class对象还在,导致窗口对应资源未被释放
有引用就肯定不释放。 没引用也要等gc完成一个full gc才会释放。 你试试切场景时调用FJsEnv上的LowMemoryNotification函数,通知v8加快gc。
自动模式下,在启动模块里加了一个监听切换场景时调用LowMemoryNotification函数,能看到被回收
目前这里有一个疑问: 我这里UI框架: ----UIMgr:ui管理类,会缓存着继承自UIPanel的界面逻辑脚本 ----UIPanl: UI逻辑脚本,界面都是继承自这个类’ ---------mWidget: UIPanel的成员变量, 对应UMG蓝图实例
销毁界面时,从UIMgr中移除UIPanel的缓存,mWidget从视口空移除,mWidget没有赋值null。夸场景的时候调用LowMemoryNotification函数,窗口未被释放,资源也未被释放,我的疑问是,UIPanel已经从UIMgr从移除了,这时候没有被引用,UIPanl应该是等待着被GC,在GC的同时,成员变量mWidget也应该是会被释放,而不需要赋值null一下吧
我在销毁窗口时,mWidget赋值null后,窗口是有被释放。难道mWidget持有者UIPanel被回收时,不会自动回收mWidget?
别给我描述那些乱七八糟的关系,我没时间看,而且你也不一定描述准确。 世界上所有gc都是一个规则,上上层楼已经描述了,细细体会,然后看要怎么做。 这仅仅处理puerts的bug或者需求,编程基础不在这里科普。
主要就是想问的是,ts对象持有蓝图资源对象时,ts对象被释放了,会自动释放它的成员变量(蓝图资源对象)嘛?还是说要手动赋值null
主要就是想问的是,ts对象持有蓝图资源对象时,ts对象被释放了,会自动释放它的成员变量(蓝图资源对象)嘛?还是说要手动赋值null
这也是gc的知识
嗯嗯,好
没被释放说明你某些地方存了引用所以释放不了啊
没被释放说明你某些地方存了引用所以释放不了啊
嗯嗯,在持有者(ts对象)不用时(没有引用了),我手动让成员变量(蓝图资源对象)赋值null。目前观察到时可以了,之前是一直认为,持有者都没有引用了,等gc回收持有者时,理应回收成员。就没手动释放了
如果持有者没引用,并不需要赋值为null。 需要赋值为null,证明持有者有引用。 v8不至于有这种低级错误,至少比你(觉得持有者没应用)的分析靠谱几十亿倍
我再查查看,还有事,一般从游戏场景切到登录场景,有必要手动调用LowMemoryNotification函数?