Unity发布错误的可能性问题整理
2017-08-25 11:56
288 查看
一
被问了几次一个同样的问题,即使Unity在编辑器模式下运行的时候都是好用的,但是一发布就挂掉了。想了一下,这可能的原因很多啊,问了几个经验丰富的朋友,滔滔不绝给我介绍了一大通,总之就一句话概括:得具体问题具体讨论!
那我整理一下可能性吧:
1.某些方法只能在编辑器模式下运行,因为它原本就是给编辑器来调试用的。
2.某些方法只能在固定的平台上运行,下面有具体讲解的一个例子
3.你程序的某些选项、某些值或者直接说你写的程序代码就有问题,就好比有一个类型你选了个EditorOnly,那就肯定之时EditorOnly了。
下面详细列举一下一些常见的问题,也感谢几位朋友的参与解答。
1、最常见的编辑器运行没问题,但是发布出来就有问题的是屏幕自适应的问题,很容易出现位置偏差和大小问题。
解决办法:锚点的设置、图片规格也可以适当调,其实主要就是调啦。
2、.0.0版本C#的线程池在编辑器里运行没问题,在IOS、安卓也都可以,但是发布webgl之后,直接就会爆出线程错误。
解决办法:用协程。(发布webgl是html5,使用多线程初始化就崩了,可能跟unity自身有关)
3、编辑器里运行没问题,发布到安卓或者IOS平台后光影消失或者产生锯齿。
原因:a、跟硬件的渲染有关系,电脑的硬件渲染和手机的硬件渲染不同,底层相同的程序硬件的支持程度不一样,所以就会导致产生不同的效果。
b、本身的shader就有问题。
解决办法:重新做支持度差不多的光影以及修改调试shader。
4、编辑器内运行,贴图没问题,但是导出后出现闪烁的情况。
原因:模型有好几个面,角度稍微不同可能会导致几个面的切换。另外,htc vive的闪烁也有可能是这样。还有就是模型制作的时候重面、UV分的有问题、贴图中带透明通道信息或者是质量选择不对都可能造成这种错误。
5、发布安卓平台时出问题,可能还有如下的原因:
a、打包安卓的时候SD卡的权限没读。
b、C#Api版本没选好
c、代码优化的问题,需要的内存大于安卓剩余内存,内存溢出导致闪退
d、发布的时候各选项的勾选问题。
其实渲染里的问题居多,原因还是那个硬件的不同导致的,更换shader之类的就可以解决,但是过程是很费时的,要慢慢来。
二
下面是查了一下Debug和Release的本质区别与调试和发布时出错的调试办法,在unity中可能用不上,但也放出来吧:
Debug和Release
作为程序员看到这两个词应该是很平常的事情吧,但是有多少程序员能够确切地清楚这两个之间的本质区别呢?
无独有偶,网上随便一搜,就会找到区别,不管懂不懂,先列出来:
Debug通常称为调试版本,它包含调试信息,并且不做任何优化,以便于程序员调试程序。
Release称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。
Debug和Release的真正秘密,在于一组编译选项。下面列出了分别针对二者的选项。
Debug版本:
/MDd /MLd 或/MTd 使用Debug runtime library(调试版本的运行时刻函数库)
/Od 关闭优化开关
/D “_DEBUG” 相当于 #define _DEBUG,打开编译调试代码开关(主要针对assert函数)
/ZI 创建Edit and continue(编辑继续)数据库,这样在调试过程中如果修改了源代码不需要重新编译
/GZ 可以帮助捕获内存错误
/Gm 打开最小化重链接开关,减少链接时间
Release版本:
/MD /ML 或 /MT 使用发布版本的运行时刻函数库
/O1 或 /O2 优化开关,使程序最小或最快
/D “NDEBUG” 关闭条件编译调试代码开关(即不编译assert函数)
/GF 合并重复的字符串,并将字符串常量放到只读内存,防止被修改
Debug和Release没有本质的界限,他们只是一组编译选项的集合,编译器只是按照预定的选项行动。我们甚至可以修改这些选项,从而得到优化过的调试版本或者是带跟踪语句的发布版本。
其中每一项的具体解释就不多作评述了,其实我也不清楚,网上一查就有了。最近看到社区好多问题都是编辑模式下运行好好的,发布之后就挂了,所以这就需要我们来调试Release版程序,这样调试过了就和发布的基本上是一样的了。
怎么“调试”Release版的程序?
遇到Debug成功但Release失败,显然是一件很沮丧的事情,而且往往无从下手。那该用怎么样的策略来解决呢?我从网上搜集了以下几种:
1.修改Release版的编译选项来缩小错误范围。可以把Release的选项诸葛改为与之相对应的Debug选项,如/MD改为/MDd、/O1改为/Od,或运行时间优化改为程序大小优化。一次修改一个选项,看看修改哪个选项的时候错误消失,再对应针对性查找。主意:这些选项在Project\Settings中都可以直接通过列表选取,通常不要手动修改。这是最有效的方法。
2.在编程过程中就要时长注意测试Release 版本,以免最后代码太多,时间又很紧迫。
3.在Debug版中使用/W4警告级别,这样可以从编辑器获得最大限度的错误信息,比如 if(i = 0) 就会引起/W4警告。不要忽略这些警告,通常这时你程序中的Bug引起的。但有时/W4会带来很多冗余信息,如未使用的函数参数警告,而很多消息处理函数都会忽略某些参数。我们可以用
#progma warning(disable:4702)//禁止
//…
#progma warning(default:4702)//重新允许来暂时禁止某歌警告,或使用
#progma warning(push,3)//设置警告级别为/W3
//…
#progma warning(pop)//重设为/W4来暂时改变警告级别,有时你可以只在认为可疑的那部分代码使用/W4。
4.你也可以像Debug一样调试你的Release版,只要加入调试符号。在Project/Settings...中,选Settings for “win32 Release”,选中C/C++标签,Category选General,Debug
Info选Program Database。再再Link标签Project options最后加上“/OPT:REF”(引号不要输)。这样调试器就能使用pdb文件中的调试符号。但调试时,你会发现断点很难设置,变量也很难找到--这些都被优化过了。不过令人庆幸的是,Call Stack窗口仍然工作正常,即使帧指针被优化,栈信息(特别是返回地址)仍然能找到。这对定位错误很有帮助。
被问了几次一个同样的问题,即使Unity在编辑器模式下运行的时候都是好用的,但是一发布就挂掉了。想了一下,这可能的原因很多啊,问了几个经验丰富的朋友,滔滔不绝给我介绍了一大通,总之就一句话概括:得具体问题具体讨论!
那我整理一下可能性吧:
1.某些方法只能在编辑器模式下运行,因为它原本就是给编辑器来调试用的。
2.某些方法只能在固定的平台上运行,下面有具体讲解的一个例子
3.你程序的某些选项、某些值或者直接说你写的程序代码就有问题,就好比有一个类型你选了个EditorOnly,那就肯定之时EditorOnly了。
下面详细列举一下一些常见的问题,也感谢几位朋友的参与解答。
1、最常见的编辑器运行没问题,但是发布出来就有问题的是屏幕自适应的问题,很容易出现位置偏差和大小问题。
解决办法:锚点的设置、图片规格也可以适当调,其实主要就是调啦。
2、.0.0版本C#的线程池在编辑器里运行没问题,在IOS、安卓也都可以,但是发布webgl之后,直接就会爆出线程错误。
解决办法:用协程。(发布webgl是html5,使用多线程初始化就崩了,可能跟unity自身有关)
3、编辑器里运行没问题,发布到安卓或者IOS平台后光影消失或者产生锯齿。
原因:a、跟硬件的渲染有关系,电脑的硬件渲染和手机的硬件渲染不同,底层相同的程序硬件的支持程度不一样,所以就会导致产生不同的效果。
b、本身的shader就有问题。
解决办法:重新做支持度差不多的光影以及修改调试shader。
4、编辑器内运行,贴图没问题,但是导出后出现闪烁的情况。
原因:模型有好几个面,角度稍微不同可能会导致几个面的切换。另外,htc vive的闪烁也有可能是这样。还有就是模型制作的时候重面、UV分的有问题、贴图中带透明通道信息或者是质量选择不对都可能造成这种错误。
5、发布安卓平台时出问题,可能还有如下的原因:
a、打包安卓的时候SD卡的权限没读。
b、C#Api版本没选好
c、代码优化的问题,需要的内存大于安卓剩余内存,内存溢出导致闪退
d、发布的时候各选项的勾选问题。
其实渲染里的问题居多,原因还是那个硬件的不同导致的,更换shader之类的就可以解决,但是过程是很费时的,要慢慢来。
二
下面是查了一下Debug和Release的本质区别与调试和发布时出错的调试办法,在unity中可能用不上,但也放出来吧:
Debug和Release
作为程序员看到这两个词应该是很平常的事情吧,但是有多少程序员能够确切地清楚这两个之间的本质区别呢?
无独有偶,网上随便一搜,就会找到区别,不管懂不懂,先列出来:
Debug通常称为调试版本,它包含调试信息,并且不做任何优化,以便于程序员调试程序。
Release称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。
Debug和Release的真正秘密,在于一组编译选项。下面列出了分别针对二者的选项。
Debug版本:
/MDd /MLd 或/MTd 使用Debug runtime library(调试版本的运行时刻函数库)
/Od 关闭优化开关
/D “_DEBUG” 相当于 #define _DEBUG,打开编译调试代码开关(主要针对assert函数)
/ZI 创建Edit and continue(编辑继续)数据库,这样在调试过程中如果修改了源代码不需要重新编译
/GZ 可以帮助捕获内存错误
/Gm 打开最小化重链接开关,减少链接时间
Release版本:
/MD /ML 或 /MT 使用发布版本的运行时刻函数库
/O1 或 /O2 优化开关,使程序最小或最快
/D “NDEBUG” 关闭条件编译调试代码开关(即不编译assert函数)
/GF 合并重复的字符串,并将字符串常量放到只读内存,防止被修改
Debug和Release没有本质的界限,他们只是一组编译选项的集合,编译器只是按照预定的选项行动。我们甚至可以修改这些选项,从而得到优化过的调试版本或者是带跟踪语句的发布版本。
其中每一项的具体解释就不多作评述了,其实我也不清楚,网上一查就有了。最近看到社区好多问题都是编辑模式下运行好好的,发布之后就挂了,所以这就需要我们来调试Release版程序,这样调试过了就和发布的基本上是一样的了。
怎么“调试”Release版的程序?
遇到Debug成功但Release失败,显然是一件很沮丧的事情,而且往往无从下手。那该用怎么样的策略来解决呢?我从网上搜集了以下几种:
1.修改Release版的编译选项来缩小错误范围。可以把Release的选项诸葛改为与之相对应的Debug选项,如/MD改为/MDd、/O1改为/Od,或运行时间优化改为程序大小优化。一次修改一个选项,看看修改哪个选项的时候错误消失,再对应针对性查找。主意:这些选项在Project\Settings中都可以直接通过列表选取,通常不要手动修改。这是最有效的方法。
2.在编程过程中就要时长注意测试Release 版本,以免最后代码太多,时间又很紧迫。
3.在Debug版中使用/W4警告级别,这样可以从编辑器获得最大限度的错误信息,比如 if(i = 0) 就会引起/W4警告。不要忽略这些警告,通常这时你程序中的Bug引起的。但有时/W4会带来很多冗余信息,如未使用的函数参数警告,而很多消息处理函数都会忽略某些参数。我们可以用
#progma warning(disable:4702)//禁止
//…
#progma warning(default:4702)//重新允许来暂时禁止某歌警告,或使用
#progma warning(push,3)//设置警告级别为/W3
//…
#progma warning(pop)//重设为/W4来暂时改变警告级别,有时你可以只在认为可疑的那部分代码使用/W4。
4.你也可以像Debug一样调试你的Release版,只要加入调试符号。在Project/Settings...中,选Settings for “win32 Release”,选中C/C++标签,Category选General,Debug
Info选Program Database。再再Link标签Project options最后加上“/OPT:REF”(引号不要输)。这样调试器就能使用pdb文件中的调试符号。但调试时,你会发现断点很难设置,变量也很难找到--这些都被优化过了。不过令人庆幸的是,Call Stack窗口仍然工作正常,即使帧指针被优化,栈信息(特别是返回地址)仍然能找到。这对定位错误很有帮助。
相关文章推荐
- 自己整理的:学习verilog DHL问题笔记——Quartus常见错误
- 解决关于那些文件夹Unity可以发布出去的问题
- [导入]发布本人整理的面试问题大全,为准备找工作的同行们尽一份力!希望大家多补充或回答!
- .net 4.0发布后不能正常显示图片问题,将iis应用程序池设置成4.0版本,报告错误:处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”
- VS2005发布网站问题及"aspnet_merge.exe”已退出,代码为 1的错误以及所有代码文件生成一个dll
- Linux下生成https自签名证书,解决苹果发布问题重新整理
- struts2 发布时出现错误(个人问题)
- 项目中遇到的问题及错误整理
- Unity发布到iOS平台后的相关问题
- 项目发布遇见的问题的整理
- 关于unity打开非自己原创工程时出现命名空间不存在等错误问题
- Maven常见问题、异常、错误整理【持续更新】
- 关于Unity发布iOS平台代码混淆问题
- 关于unity发布的一些问题
- unity直连sqlserver数据库发布后不能连接的问题
- 通过IIS发布网站遇到的一些问题整理
- Unity 开发常见问题整理 (一)yield return 不执行的原因
- 关于高通AR vuforia 4.2.3在UNITY5.0中发布到安卓白屏的问题
- MVC4 网站发布(整理+部分问题收集和解决方案)
- 我在使用Unity 发布IOS真机过程时遇到的关于JIT的问题列表