Unity Bugs 总结

发表于2017-03-15
评论0 3.5k浏览


| 导语 使用Unity的过程中,发现了几个比较重要或不容易发现的Bug,在这里把这些unityBUG整理发布出来,是希望能节省大家的时间,对大家查问题有点启发

·                     5.3.3

·                                instanceID

·                                二维数组越界

·                                Mesh Read/Write

·                                骨骼动画,事件初始化顺序有问题,导致Crash

·                                人物模型变黑

·                                后处理占用内存大

·                                小米5和红米2A发生渲染卡住问题

·                                使用Optimize Game Objects后,武器旋转不正确

·                     5.4.2

·                                iOS AssetBundleRequest.isDone Not True

·                                Memory Profiler Take Sample Faile

·                     5.5.0

·                                iOS Application:OpenURL Crash

·                                iOS Apollo无法收到网络消息

5.3.3

instanceID

iOS中,IL2CPP转成C++后,在ObjectDestroy后,它的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];
    }

MeshRead/Write

根据Unity官方的文档,打开后会导致在内存中保留一个Mesh数据的副本,理论上,关闭后,会减少内存占用


但关闭这个选项后,iOS下在切换场景时,竟然Crash了。。

怀疑是由于IL2CPP的代码没有做保护,导致Unity的部分C#代码,在执行时发生了内存问题

骨骼动画,事件初始化顺序有问题,导致Crash


在骨骼动画的Events轴上,在0添加了一个事件,在这个事件中,执行了SetActive(False)的行为,结果导致了Crash

而且,会导致编辑器也整个Crash

应该是Unity的初始化顺序处理有问题

解决办法:
把事件在时间轴上往后挪动一点点就好了

人物模型变黑


不强制使用32bitDisplay Buffer后,在红米 note1中,这个问题已经修复,不再必现。
但是在OPPO R7机型中,还是会偶现这个问题

在红米note1中,会看到EGLGLES的报错,看起来是EGL请求的配置获取不到



解决办法:
还没有找到

后处理占用内存大

iPad mini 4 上实测

Unity新的官方后处理代码中,优化了后处理的性能,减少了DrawCall

https://www.youtube.com/watch?v=XKxhYjGHm3g

但还没有实际测试

小米5和红米2A发生渲染卡住问题

比较诡异的是,在小米5中,并不是卡死的,只是framebuff的交换不工作了

具体原因应该是有人使用5.3.4等高版本来打开了工程,并修改了GraphicsSettings
在上传时,把useScreenSpaceShadows给打开了

然而并不是。。其实是UnityStandalone平台时,就会打开这个选项,而在Mobile平台时,不会。。
Unity forum link

使用Optimize Game Objects后,武器旋转不正确

查过之后,发现是FBX资源的问题

3DMax默认的骨架是肩膀作为脖子的子的,在Unity中,这种做法会给一个警告

但是在我们的项目中,在使用Optimize Game Objects时,会导致武器旋转出错

但是,比较诡异的是,穿越火线手游项目中,也是使用3DMax的默认骨架,他们却没有问题。。

最后确认问题是武器挂点也需要Key,如果没有关键帧,在计算时,它的旋转信息会不正确

穿越火线中,挂点也是有关键帧的

5.4.2

iOS AssetBundleRequest.isDone Not True

如果在一个资源还没有加载完成时,再次请求加载,在iOS中非常容易发生isDone永远不为True的问题

Memory Profiler Take Sample Faile

Take Sample时,好像是改成了异步了,可以看到有大量的网络数据传输,但最终并没有正确地显示出来
创建一个最简单的工程,都可以复现这个问题,在Android下几乎是必现的

Unity5.5中也没有修正。。


Unity5.5.0p1Unity5.4.3p3中,这个问题终于被修复了。。

5.5.0

iOS Application:OpenURL Crash

https://issuetracker.unity3d.com/issues/ios-crash-in-application-openurl-sourceapplication-annotation-due-to-missing-null-check-with-facebook-sdk

5.5.0IL2CPP优化了一下,但这里遗漏了保护。会导致游戏拉起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中加入这两行就好了

iOSApollo无法收到网络消息

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就给大家介绍到这里了,希望对大家有帮助。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引