【Unity填坑日记】UGUI崩溃巨坑:UI::CanvasRenderer::SyncDirtyElements
来源:互联网 发布:赤壁赋一词多义知乎 编辑:程序博客网 时间:2024/06/05 05:35
在使用UGUI的项目中经常遇到诸如
0x0000000140044A66 (Unity) Unity::GameObject::IsActive
0x00000001411B2E73 (Unity) UI::CanvasRenderer::SyncDirtyElements
0x00000001411BFAC9 (Unity) UI::CanvasManager::UpdateDirtyRenderers
0x00000001411BD336 (Unity) UI::Canvas::UpdateBatches
0x00000001411BE11C (Unity) UI::CanvasManager::WillRenderCanvases
0x00000001403B6C8C (Unity) PlayerLoop
0x0000000140B98C3C (Unity) Application::UpdateScene
0x0000000140B9A6F9 (Unity) Application::UpdateSceneIfNeeded
0x0000000140BA0C84 (Unity) Application::TickTimer
0x0000000140DD1197 (Unity) RelaunchUnity
0x0000000140DD277B (Unity) WinMain
0x00000001414EB994 (Unity) read
0x00000000778B59BD (kernel32) BaseThreadInitThunk
的错误,而且最要命的是,一般不在Editor上出现,一般是在iOS、ANDROID真机上小概率随机出现。而一出现就直接游戏崩溃,一发入魂。。
这个问题从unity5.1开始一直困扰到5.3.5p3都没有得到彻底解决,在更新到5.3.5p3后发现该问题居然能在editor出现了。于是花了一整晚时间找这个原因……
根据unity的出错信息,大概猜测是死在了render一个已经销毁的UI element
通过检查代码,发现我们的一个清空Transform下所有子物体的写法如下:
public static void DestroyChildren(Transform transform) { int childCount = transform.childCount; for (int i = childCount - 1; i >= 0; --i) { var go = transform.GetChild(i).gameObject; GameObject.Destroy(go); } transform.DetachChildren();}
怀疑是Destroy后,Unity存在一个BUG导致CanvasRenderer还继续访问了该物体(已经为NULL)
修改代码如下后,问题解决
public static void DestroyChildren(Transform transform) { int childCount = transform.childCount; for (int i = childCount - 1; i >= 0; --i) { var go = transform.GetChild(i).gameObject; go.SetActive(false); //by CG:如果不延迟释放,则会crash:UNITY BUG:UI::CanvasRenderer::SyncDirtyElements GameObject.Destroy(go, 0.3f); } transform.DetachChildren(); }
我只能说……此处太坑……
- 【Unity填坑日记】UGUI崩溃巨坑:UI::CanvasRenderer::SyncDirtyElements
- UGUI崩溃巨坑:UI::CanvasRenderer::SyncDirtyElements
- 【UNITY填坑日记】UGUI不消耗DRAW CALL的EventTrigger接收器
- UNITY SPRITES: SPRITERENDERER VS. CANVASRENDERER (UI IMAGE)
- 【UNITY填坑日记】unity图片资源优化神器dither4444
- Unity Windows 填坑日记之导出篇
- springboot填坑日记
- Tensorflow 填坑日记
- 【unity填坑日记】unity IOS 32/64兼容编译使用TextAsset导致的问题
- 填坑日记2017.3.6
- 【unity填坑日记】Array[] Contains导致IOS AOT编译错误
- 十、VueJs 填坑日记之在项目中使用Amaze UI
- Unity UI系统-UGUI简介
- Ionic 填坑日记(一)
- Ionic填坑日记(二)
- 前端国际化解决方案“填坑日记”
- Unity UGUI——UI基础,Canvas
- Unity UGUI 是否点击在UI上
- 对象的原型链
- 关于Java中的final
- Android多线程编程之AsyncTask学习篇(二)
- RxJava操作符(03-变换操作)
- Binder学习笔记(十一)—— 智能指针
- 【Unity填坑日记】UGUI崩溃巨坑:UI::CanvasRenderer::SyncDirtyElements
- Swap Nodes in Pairs
- Centos 7 静态IP设置
- vmware 不能更改网络为桥接:已没有未桥接的主机网络适配器
- 《Learn More Study Less》笔记总结
- 代码备份jquery.smart.js
- 梳理html-运行原理
- HTML5-前端开发很火且工资很高?
- 浅谈附属类,内部类,匿名内部类,静态内部类