Unity3D实验室之iOS真机闪退的解决方法

问题的产生

这个问题一般发生在项目比较大,OO使用良好,泛型继承用的较多的时候。第一次真机测试时,项目终于进入真机测试阶段,之前都是在Unity编辑环境下开发测试,运行的都很良好,信心满满的打包安装,结果闪退。。。,各种代码调试,跟踪都没什么线索。这怎么办?问题很可能出在了AOT的设置上。

解决方案

这个通常是因为你的程序编译的时候给 trampoline 分配的空间太小,而你的程序中又大量使用了泛型、泛型方法调用和接口实现导致的。具体的解决方法就是在 Unity3D 的编译选项 Player Setting 中有一个 AOT Compilation Options 条目,在这个选项条目中加上以下编译参数就好了

nrgctx-trampolines=8192,nimt-trampolines=8192,ntrampolines=4096

加上以后,重新打包测试,看还有没有问题

参数意思

关于上面的三个参数的意思分别如下:

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

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

ntrampolines=4096 这是留给泛型方法调用使用的空间,默认是 1024

什么是trampoline

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

这看起来明显是为了提高 mono runtime 在执行 C#代码时候的效率,但还是有点不明白。

再来看看官方文档关于 JIT Trampolines 和 AOT Trampolines 的介绍:

JIT Trampolines 这些 Trampoline 主要是 JIT 在首次调用某个方法的时候编译方法用的。当 JIT 在编译一个方法调用指令时,它并不会立刻就编译这个被调用到的方法。实际上,它会先创建一个 JIT Trampoline,同时创建一个指向这个 trampoline 的调用指令。当这个 JIT Trampoline 在调用到的时候,它会再调用 mono_magic_trampoline() 方法来编译这个 trampoline 实际指向的目标方法,然后将编译后的方法的指针地址返回给这个指向它的 trampoline。这个过程呢稍微有点慢,所以呢,mono_magic_trampoline() 方法会优化调用 JIT 代码的过程,它会先尝试调用已经通过 JIT 编译过的方法而不是立即通过 trampoline 直接进行调用。这些都是通过在 tramp-.c 文件中的 mono_patch_callsiete() 方法来完成的。

AOT Trampolines

AOT Trampolines 和 JIT Trampolines 非常相似,但是 AOT Trampolines 接受的编译参数不是一个 Mono 方法而是一个 image+token 对。如果传入的用于编译的 image+token 对所指向的方法已经经过 AOT 编译过了,那么再次编译这个 image+token 对时,就会直接返回这个已编译方法的指针地址而不需要再次加载这个方法的元数据进行再次编译了。

IMT Trampolines也是用于优化接口调用效率的。

Trampolines 存在的价值就是为了减少 C#代码在 mono runtime 中运行时的性能损耗,提高 C#代码的执行效率。

总结

当遇到类似问题时可以试试上面的方法。

以上这篇Unity3D实验室之iOS真机闪退的解决方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Unity3d发布IOS9应用时出现中文乱码的解决方法

    简单的说,解决方法就是批量修改NGUI的label字体,修复ios就删除arial引起的中文乱码 我们来看具体如何操作 static public void yaheifont() { uf = AssetDatabase.LoadAssetAtPath("Assets/yahei.prefab",typeof( UIFont)) as UIFont; UnityEngine.Object[] objs = Selection.GetFiltered (typeof(UnityEngi

  • 浅谈Unity中IOS Build Settings选项的作用

    Run in Xcode as:分Release选项和Debug选项,分别对应的是Xcode中Scheme编辑的BuildConfiguration的Debug和Release选项 Symlink Unity libraries:这是专为IOS平台用的,是一个全名叫做Symbolic Link Unity Libraries的runtime库,勾选后,xcode工程会直接在Unity的安装路径下引用Unity ios runtime library,不勾选,这些ios动态库会直接copy到xco

  • iOS与Unity交互笔记之参数传递

    1. 调用方法一 Unity调方法传参,有返回值 // Unity代码 [DllImport("__Internal")] // 给iOS传string参数,有返回值,返回值通过iOS的return方法返回给Unity private static extern string getIPv6(string mHost, string mPort) // iOS代码 extern "C" const char * getIPv6(const char *mHost,

  • Unity iOS混合开发界面切换思路解析

    思路 之前一篇文章里面只谈到了Unity和iOS工程的融合,并没有谈到iOS和Unity界面的切换,这里谈谈思路,Unity导出的iOS工程里面的结构大致是这样的,有一个Window,Window上有一个UnityView,但是并没有控制器,也没有根控制器,虽然在导出的iOS工程中Classes文件夹下的UnityAppController中有rootController的属性,但是上面也标注为空~ 所以,思路就只有一种,,既然Unity导出的iOS工程有一个Window并没有控制器,那好,混合

  • Unity3D实验室之iOS真机闪退的解决方法

    问题的产生 这个问题一般发生在项目比较大,OO使用良好,泛型继承用的较多的时候.第一次真机测试时,项目终于进入真机测试阶段,之前都是在Unity编辑环境下开发测试,运行的都很良好,信心满满的打包安装,结果闪退...,各种代码调试,跟踪都没什么线索.这怎么办?问题很可能出在了AOT的设置上. 解决方案 这个通常是因为你的程序编译的时候给 trampoline 分配的空间太小,而你的程序中又大量使用了泛型.泛型方法调用和接口实现导致的.具体的解决方法就是在 Unity3D 的编译选项 Player

  • ubuntu上在androidstudio中启动emulator闪退的解决方法

    阅读目录(Content) 平台 现象 解决 一.查看模拟器的信息 二.命令行运行模拟器 平台 Ubuntu14.04 64 现象 在AndrodStudio中点击模拟器的启动按钮后,模拟器界面弹出后,又立刻闪退. 解决 一.查看模拟器的信息 从上面可以看到模拟器的存放路径以及名称: 路径:/home/pengdonglin/.android/avd/4_WVGA_Nexus_S_API_24.avd 名称:4_WVGA_Nexus_S_API_24 架构:x86_64 二.命令行运行模拟器 在

  • VS2019 安装时闪退的解决方法

    现象:  安装VS2019时,下面的界面运行后退出,没有自动弹出下一步的安装界面 原因分析: VS2019的运行安装环境为win10, 而我的运行环境是win7+64位,可能存在不兼容性 解决办法: 第一步:进入C:\Program Files (x86)\Microsoft Visual Studio\Installer中,找到vs_installer.exe 和 vs_installershell.exe,并分别改变他们的兼容模式,具体如下: 第二步: 改变安装程序的运行属性,并以管理员身份

  • 详解Tomcat双击startup.bat闪退的解决方法

    作为一个刚学习Tomcat的程序猿来说,这是会经常出现的错误. 1.环境变量问题 1.1 首先需要确认java环境是否配置正确,jdk是否安装正确 win+R打开cmd,输入java 或者 javac 出现下图所示就说明jdk配置正确: 如果没有,则参考jdk的安装及配置 如果以上都没有问题,则向下看. 1.2确认Tomcat的环境变量配置 对于免安装版的Tomcat来说,在启动Tomcat时,需要读取环境变量和配置信息,缺少了这些信息,就不能登记环境变量,导致闪退. 解决方法: 1:在已解压的

  • MySQL 5.7安装好后打开命令行窗口闪退的解决方法

    前言 最近在安装好MySQL 5.7发现了一个问题,打开命令行窗口会闪退,后来发现原来是这个问题 若是因为在mysql安装目录下找不到my.ini文件,请接着往下看 解决方法 返回桌面,在开始出找出--MySQL 5.7 cammand line client并右键打开文件位置 属性-查看"目标"中的完整路径,我这里是"C:\Program Files\MySQL\MySQL Server 5.7\bin\mysql.exe" "--defaults-fi

  • mysql 登录时闪退的问题解决方法

    mysql 登录时闪退的问题解决方法 之前mysql用着好着,可是今天在启动mysql后输入密码出现了闪退,在任务管理器中发现mysql服务没有启动,当手动启动时提示拒绝访问.在网上查找原因发现问题所在. 问题原因:mysql服务没有安装. 解决办法: 在cmd操作下找到mysql的安装目录(注意要用管理员身份运行cmd) 在 mysql bin目录下 以管理员的权限 执行 mysqld -install命令 然后仍然以管理员的权限 net start mysql 开启Mysql服务了. 输入m

  • Android实现分享微信好友及出现闪退的解决办法

     1.申请微信APPID 要实现分享到微信的功能,首先要到微信开放平台申请一个APPID.但在申请APPID的时候需要填写一个应用签名和应用包名.需要注意的是包名必须与开发应用时的包名一致,应用签名也必须去掉冒号而且字母为小写. 2.应用签名的获取 开发android应用的人很多,很有可能类名.包名起成了同一个名字,签名这时候就起到区分的作用. 所有的Android应用都必须有数字签名,不存在没有数字签名的应用,包括模拟器运行的.模拟器开发环境,开发时,通过ADB接口上传的程序会自动被签有Deb

  • ios 不支持 iframe 的完美解决方法(兼容iOS&安卓)

    最近做微信公众号页面,因为入口不同,需要把公共页面抽取出来,然后根据不同的值,传递给后台不同的入口.刚开始用iframe页面嵌套(第一次尝试使用),但发现iOS系统对iframe嵌套页面的高度和定位控制的不到位,具体表现为,当嵌套的子页面的高度大于父页面的高度,且子页面中有触发弹框事件时,这时,如果子页面高度远远大于父页面高度,就会出现弹框找不到的情况,其实可能是在视口以下,弹框的位置只是相对于子页面来定位,并没有相对于视口定位. 尝试了好多种方法,均不理想,而安卓系统则表现良好,于是想到,iO

  • Android 表情面板和软键盘切换时跳闪问题的解决方法

    现在很多应用都会在让用户输入各种文本信息的时候同时多提供一个表情面板,这样就会出现一个问题,即表情面板的跳闪问题要输入文本信息,那固然是需要弹出软键盘,在软键盘显示的情况下,此时如果要切换显示出表情面板,由于表情面板不可能和用户的软键盘高度恰好一样,此外由于控件的上下移位,就会出现表情面板的跳闪现象 在点击切换按钮的时候,表情面板会先向上跳,然后再往下移,这样就会带来很差的用户体验,效果如下图所示: 这里提供一个解决方案,使软键盘和表情面板可以很自然地切换,效果如下图所示: 解决思路主要是这样:

  • 移动端页面在ios中不显示图片的解决方法

    在移动端开发中,有的时候可能遇到这样的问题,我从别人网站上下载下来的图片,然后做出H5页面,但是在浏览器中和android中都显示正常,可是一到ios中图片就不显示了,这个时候就需要注意了,可能是图片的格式问题导致ios中不认识,比如我从网上下载的图片保存到电脑中不能预览的图片就是这种. 在计算机中打开预览图片显示如下: 这样的图片在ios中就不显示,解决办法很简单,就是在下载的时候去掉后面的类型就可以了, 以上这篇移动端页面在ios中不显示图片的解决方法就是小编分享给大家的全部内容了,希望能给

随机推荐