Unity Bugs 总结
| 导语 使用Unity的过程中,发现了几个比较重要或不容易发现的Bug,在这里把这些unityBUG整理发布出来,是希望能节省大家的时间,对大家查问题有点启发
· 5.3.3
· 二维数组越界
· 人物模型变黑
· 后处理占用内存大
· 使用Optimize Game Objects后,武器旋转不正确
· 5.4.2
· iOS AssetBundleRequest.isDone Not True
· Memory Profiler Take Sample Faile
· 5.5.0
· iOS Application:OpenURL Crash
在iOS中,IL2CPP转成C++后,在Object被Destroy后,它的InstanceID被清零了
5.3.3
1 | Result: False V: 0 oldHash: -10016 newHash: 0 ==: True RefCheck: False |
然而在5.4版本中,这个问题被修正了
由于Unity重写了GetHashCode这个方法,如果在一个dictionary里使用UnityEngine.Object作为key,那么,在它被Destroy后就无法删除掉了
在XLua中,由于这个bug,导致iOS中内存泄漏
在iOS中,IL2CPP转换的代码,并没有执行越界保护,在Android中是一个Exception的问题,在iOS中会直接引起崩溃
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | // GameData.GeFigureInfoData[,] struct GeFigureInfoDataU5BU2CU5D_t1937175484 : public Il2CppArray { public : ALIGN_TYPE (8) GeFigureInfoData_t3987967822 * m_Items[1]; public : inline GeFigureInfoData_t3987967822 * GetAt(il2cpp_array_size_t index) const { return m_Items[index]; } inline GeFigureInfoData_t3987967822 ** GetAddressAt(il2cpp_array_size_t index) { return m_Items + index; } inline void SetAt(il2cpp_array_size_t index, GeFigureInfoData_t3987967822 * value) { m_Items[index] = value; Il2CppCodeGenWriteBarrier(m_Items + index, value); } inline GeFigureInfoData_t3987967822 * GetAt(il2cpp_array_size_t i, il2cpp_array_size_t j) const { il2cpp_array_size_t index = i * bounds[1].length + j; return m_Items[index]; } |
根据Unity官方的文档,打开后会导致在内存中保留一个Mesh数据的副本,理论上,关闭后,会减少内存占用
但关闭这个选项后,iOS下在切换场景时,竟然Crash了。。
怀疑是由于IL2CPP的代码没有做保护,导致Unity的部分C#代码,在执行时发生了内存问题
在骨骼动画的Events轴上,在0点添加了一个事件,在这个事件中,执行了SetActive(False)的行为,结果导致了Crash
而且,会导致编辑器也整个Crash掉
应该是Unity的初始化顺序处理有问题
解决办法:
把事件在时间轴上往后挪动一点点就好了
不强制使用32bit的Display Buffer后,在红米 note1中,这个问题已经修复,不再必现。
但是在OPPO R7机型中,还是会偶现这个问题
在红米note1中,会看到EGL和GLES的报错,看起来是EGL请求的配置获取不到
解决办法:
还没有找到
在iPad mini 4 上实测
Unity新的官方后处理代码中,优化了后处理的性能,减少了DrawCall
https://www.youtube.com/watch?v=XKxhYjGHm3g
但还没有实际测试
比较诡异的是,在小米5中,并不是卡死的,只是framebuff的交换不工作了
具体原因应该是有人使用5.3.4等高版本来打开了工程,并修改了GraphicsSettings
在上传时,把useScreenSpaceShadows给打开了
然而并不是。。其实是Unity在Standalone平台时,就会打开这个选项,而在Mobile平台时,不会。。
Unity forum link
使用Optimize Game Objects后,武器旋转不正确
查过之后,发现是FBX资源的问题
3DMax默认的骨架是肩膀作为脖子的子的,在Unity中,这种做法会给一个警告
但是在我们的项目中,在使用Optimize Game Objects时,会导致武器旋转出错
但是,比较诡异的是,穿越火线手游项目中,也是使用3DMax的默认骨架,他们却没有问题。。
最后确认问题是武器挂点也需要Key帧,如果没有关键帧,在计算时,它的旋转信息会不正确
穿越火线中,挂点也是有关键帧的
iOS AssetBundleRequest.isDone Not True
如果在一个资源还没有加载完成时,再次请求加载,在iOS中非常容易发生isDone永远不为True的问题
Memory Profiler Take Sample Faile
在Take Sample时,好像是改成了异步了,可以看到有大量的网络数据传输,但最终并没有正确地显示出来
创建一个最简单的工程,都可以复现这个问题,在Android下几乎是必现的
在Unity5.5中也没有修正。。
在Unity5.5.0p1和Unity5.4.3p3中,这个问题终于被修复了。。
5.5.0,IL2CPP优化了一下,但这里遗漏了保护。会导致游戏拉起QQ或微信登陆,回来时就Crash
修改方法:
1 2 | UnityAppController.WriteBelow( "[values addObject:value];n" , "n" ); UnityAppController.WriteBelow( "[keys addObject:key];" , "if (value == nil) { n [values addObject:[NSNull null]]; n } else { n [values addObject:value]; n} " ); |
在XCodePostProcess中加入这两行就好了
IL2CPP的变更,函数声明需要修改一下
1 2 | [DllImport(ApolloCommon.PluginName, CallingConvention = CallingConvention.Cdecl)] private static extern ApolloResult apollo_connector_readData(UInt64 objId, [MarshalAs(UnmanagedType.LPArray)] byte [] buff, ref int size); |
修改为
1 2 | [DllImport(ApolloCommon.PluginName, CallingConvention = CallingConvention.Cdecl)] private static extern ApolloResult apollo_connector_readData(UInt64 objId, byte [] buff, ref int size); |
关于在unity开发中碰到的那些bug就给大家介绍到这里了,希望对大家有帮助。