克隆预制后脚本对象存在多个实例,有问题?

  • Creator 版本:2.1.2

  • 目标平台: Web Chrome

  • 详细报错信息,包含调用堆栈:有图有真相,有demo

  • 重现方式:

构造被调用多次,按理解应该只有一次,因为可见的初始化只有一次。

1、启动关注控制台输出,再关注开发者工具中memory
2、再克隆预制,在关注控制台,再关注memory
3、click2close后,关注关注
4、release,再关注关注

  • 之前哪个版本是正常的 :

  • 手机型号 :

  • 手机浏览器 :

  • 编辑器操作系统 :

  • 编辑器之前是否有其它报错 :

  • 出现概率:

  • 额外线索:

截图如下:







demo如下:
test3.rar (209.7 KB)

注意,截图顺序可能不对。

我看下这个问题

确实有这个问题,我这边建议你可以不在预制体上挂载脚本组件,而是在预制体实例化之后,再为该节点添加脚本组件。
也就是:

node.addComponent('JS File Name');

这个问题我提一个issues,尽快确认问题。

感谢回复。
以上问题关乎内存问题。
你说的这种方式可以解决两次或多次构造的问题,但是有个麻烦就是脚本中节点变量挂载是个蛋疼的事情。

当前我组一个微信小游戏 各类弹窗共计32个…即32个预制32个脚本 脚本还有继承关系 。结果可想而知

多出的一份内存是这个Prefab的加载缓存, 通过下面方法是可以释放掉的,因为加载过程会做 new 对象的处理,所以会调用构造函数。

let dps = cc.loader.getDependsRecursively(‘test’);
cc.loader.release(dps);

是的这种做法可以释放多余的一个对象。但是档期再次克隆打开,停在该预制界面,再看内存,此时有时两个对象,两次构造。若是各个弹窗比较复杂,数据比较多,那么内存数据就有两份。建议试试上面这个demo。

你做了释放,下次加载,当然还是会有两个,一个是加载缓存,一个实例化的节点

科学吗?可以使用一个实例吗?这样整,那岂不是任何预制克隆出来的脚本对象实例至少都有两份儿?

加载缓存,只会有一份,不做缓存,每次都会从网络加载资源

这么说我释放了,下次加载还是得从网络下载?

那是否能处理为:克隆一次的时候直接使用这个缓存,克隆二次或更多次的时候再new 实例呢?

复用预制实现弹窗或相同属性的节点(例如子弹),大家需要的是属性的拷贝,真正克隆时才实例化,而不是一上来就实例化。
或者你是否可以给科普下,预制的作用呢?或是使用预制的正确姿势?