cocos-engine
cocos-engine copied to clipboard
UIRenderManaer 的 UpdateAllRenders 函数存在数据漏处理
Cocos Creator version
3.8.1
System information
any
Issue description
真实使用场景,基于label的长度,动态设置背景的宽度。 //可复现问题的代码 private onLoad(){ this.titlelabel.node.on(Node.EventType.SIZE_CHANGED, () => { this.onTextSizeChange() }); }
private onTextSizeChange(){
this.bg.node.transform.width = this.titlelabel.transform.width + 50
}
Bug 问题推演:
- 修改titlelabel的 string, 会让 label 进入 UIRenderManager 的 _dirtyRenderers
- UIRenderManager.updateAllDirtyRenderers() 会调用到 ttfUtils.updateRenderData
- 137 行更新 label node 的宽高,触发Node的EventType.SIZE_CHANGED事件。
- 游戏逻辑修改 bg 的宽度,会让 label 进入 UIRenderManager 的 _dirtyRenderers。
- 因为UIRenderManager.updateAllDirtyRenderers()遍历时记住了长度。所以 bg 的修改不会触发updateRenderData.
- updateAllDirtyRenderers函数退出时会清理_dirtyRenderers。
- 最终 bg 的这次宽度修改没有更新到渲染数据中去。
Relevant error log output
No response
Steps to reproduce
逻辑 bug
Minimal reproduction project
No response