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
- Unity IOS项目切换场景时概率性闪退的分析与解决方案
- Unity实现场景切换的方法
- Unity实现场景切换的方法
- Unity实现场景切换的方法
- Unity 切换场景变黑的问题
- Unity场景切换时传递数据
- Unity--无缝场景切换
- Unity 基础 场景切换
- Unity中的场景切换
- 【Unity】切换场景
- Unity场景切换
- unity 场景 切换 笔记
- Unity切换场景研究
- Unity HTC修改场景切换的过渡场景
- Unity入门操作_Application类与切换场景 _010
- Unity项目移植WP8碰到的问题与解决方案。
- Unity3d的ios项目在场景切换时候Crash的问题
- unity场景切换异步加载
- 完全自动化测试
- TCP服务端收到syn但是不回复syn ack问题分析
- 【数论定理】卢卡斯定理
- 数据结构之队列的链式表示及其实现
- 扩展欧几里得算法模板(希望永远不要搞懂了)
- Unity IOS项目切换场景时概率性闪退的分析与解决方案
- 提高面试代码质量的三要素
- Recycleview添加分割线
- 求jstree大神指导
- Fully Convolutional Networks for Semantic Segmentation
- Spring MVC 学习总结(二)——控制器定义与@RequestMapping详解
- 原生Js的几种时间效果
- Android TV 笔记
- markdown编辑器手册