Unity IOS项目切换场景时概率性闪退的分析与解决方案

来源:互联网 发布:手机淘宝查看历史价格 编辑:程序博客网 时间:2024/06/07 02:40


        在项目中遇到IOS版本经常性闪退的问题,分析发现闪退普遍性存在场景切换的过程中,并且没有必现性,没有找到从场景A到场景B一定会闪退的先决条件,一般是游戏持续进行3-4分钟后,某次切换场景便会闪退。

        首先分析最初的log,发现闪退时Debug.Log("[SCENE] Start to show Scene "+ sceneName); 切换场景的Log输出后,发送协议的Log有时也会输出,说明闪退应该发生在异步切换场景的协程中。

         分析协程ShowSceneAsync代码,协程中又开启了几个协程。在每个协程结束后加入排错Log分析程序闪退时的具体的协程,但并未发现普遍规律,游戏闪退时没有确定执行到哪个协程。又因在项目安卓版本未出现这样的闪退现象,故分析闪退原因不在Unity中。

        使用Xcode运行游戏工程,闪退时Xcode抛出异常Ran out of trampolines of type 2。查询资料是程序编译的时候,给Trampolines分配的空间太小,而程序中又使用了大量的泛型,泛型方法调用和接口实现导致的。 找到Mono Runtime的官方文档关于trampoline的描述如下:

 Trampoline是一些手写的非常短小的用来在 mono 运行时中执行很多操作的组件代码。主要是通过 JIT 使用到的本地代码宏在运行时动态生成的。它们通常都有与之相对应的 C 方法,在某些较为复杂的场景中,当 trampoline 无法胜任时,mono运行时就会将这些复杂的操作交回给这些对应的 C 方法来执行。这也可以看作是将 JIT 代码的执行权交回给 runtime 的一种方式。

       查询英文文献解决异常的方案是人为的增大给Trampolines分配的空间

                     nrgctx-trampolines:这是留给递归泛型使用的空间,默认是1024

                     nimt-trampolines:这是留给接口使用的空间,默认是128

                     ntarmpolines:这是留给泛型方法调用使用的空间,默认是1024

        Unity在打包的时候可以附加Aot编译选项,直接在PlayerSettings下的AotCompilationOptions选项下加入命令即可:




参考网址:

http://forum.unity3d.com/threads/ran-out-of-trampolines-type-2.84775/

http://7dot9.com/2014/03/28/unity3d%E6%B8%B8%E6%88%8F%E5%9C%A8ios%E4%B8%8A%E5%9B%A0%E4%B8%BAtrampolines%E9%97%AA%E9%80%80%E7%9A%84%E5%8E%9F%E5%9B%A0%E4%B8%8E%E8%A7%A3%E5%86%B3%E5%8A%9E%E6%B3%95/

http://monotouch.2284126.n4.nabble.com/Understanding-the-impact-of-trampolines-td4495086.html
















0 0
原创粉丝点击