3.0.0 在节点destroy之后一行修改节点位置,就会报“invalid buffer pool handle”警告,但是在1.2.0或者在destroy前一行修改就不会


怎么解决呢
证明3.0把bug修复了。
3.0在节点销毁时候放入了NodePool里,1.2的时候就没有,就是因为加的这个操作才报的警告
节点销毁之后还要再去访问修改节点的属性本身就是错误行为,3.0 会更加严格杜绝
node.destroy()之后,在修改节点属性之前判断了node.isValid,但是该值仍然为true,下一帧node.isValid才为false;
如果使用cc.isValid(node)可以在node.destroy()的调用帧得到false,是需要统一使用cc.isValid()去判断吗,还是引擎的问题;如果需要使用cc.isValid(node)判断节点可访问性,那node.isValid有什么用;
收到,我反馈一下
调用node.destory()后,还需要去操作node的行为本身是有点问题的。
https://docs.cocos.com/creator/3.0/api/zh/classes/core_data.ccobject-1.html#isvalid
在API其实有对node.isValid做了说明的
但是这样的逻辑会造成,节点的有效性和node.isValid不一致,代码中想要判断节点有效性必须使用cc.isValid(node,true),因为在判定节点有效性时候,并不知道节点的destroy是在哪一帧调用的,如果知道destroy()的调用帧,也就不用判断了
你的需求是需要使用 cc.isValid(node,true) 来判断的。
1 node.destory销毁的时候,也并不是立马销毁的, 实际销毁操作会延迟到当前帧渲染前执行。从下一帧开始,该对象将不再可用。
https://github.com/cocos-creator/engine/blob/v3.0.1/cocos/core/data/object.ts#L247
2 node.isValid在 从下一帧开始
isValid 就会返回 false,而当前帧内 isValid 仍然会是 true。https://github.com/cocos-creator/engine/blob/v3.0.1/cocos/core/data/object.ts#L217
3 文档写的还是比较清楚的, 如果希望判断当前帧是否调用过
destroy,请使用 isValid(obj, true)。不过这往往是特殊的业务需求引起的,通常情况下不需要这样。
文档我仔细看过了,不过还是有一点疑惑,node.destory()的当前帧node.isValid = true; 那就表示该节点在当前帧应当还是可访问的吧,文档里也说了到下一帧该对象将不再可用,既然是可访问的为什么进行属性更改会报警告
或者说为什么不在调用node.destroy()的时候将node.isValid直接置为false
麻烦看看这个警告



