还原堆栈信息,分析地形系统使用ASTC格式的纹理导致Crash的问题
0x00 前言
在这篇文章中,我们选择了过去一周Unity官方社区交流群中比较有代表性的几个问题,总结在这里和大家进行分享。主要涵盖了IL2CPP、Scripting、Virtual Reality、Graphics、Editor、Terrain、Plugins 、Education等领域,其中会着重介绍一下在原生的地形系统中使用ASTC格式纹理导致Crash的问题。
在文章结尾处我们还总结了社区小伙伴们过去一周在群里分享的一些干货连接。
同时,也欢迎大家加入我们这个讨论干货的官方技术群,交流看法分享经验。
Unity官方社区交流群:629212643
0x01 IL2CPP
Q: 有人遇到过GZipStream在安卓上没办法正常工作的问题么?在Editor中工作是正常的。但是在安卓手机上会无法执行,查看logcat发现在执行时抛出了下面的异常:
Unable to find MonoPosixHelper
DllNotFoundException: MonoPosixHelper
A: 如果项目的scripting backend使用的是Mono,则在使用System.IO.Compression命名空间时的确会抛出类似上面的异常。但是如果使用IL2CPP的话,System.IO.Compression命名空间是可以正常使用的,包括GZipStream同样也是可以正常使用的。
0x02 Scripting
Q: 如何求一个数最大能是2的多少次幂啊? 比如513最大是2的9次幂,就多了一位数. math里有没有这样的方法,想要模拟cullingmask那样的筛选层出来。
A: 用查找表,尽量限制在512之内。
(郑州(๑•̀.̫•́๑)大FC)
A:
int Exp(int i)
{
int counter = 0;
while(i > 1)
{
i = i >> 1;
counter++;
}
return counter;
}
void outpuLayers(int layerValue)
{
while(layerValue > 0)
{
int i = layerValue;
int counter = 0;
while (i > 0)
{
i = i >> 1;
counter++;
}
Debug.Log(counter);
i = 1;
while (counter > 1)
{
counter--;
i = i << 1;
}
layerValue = layerValue ^ I;
}
}
(南京-科穆宁)
A: 查表法如果要支持20+的layer数,内存占用爆炸。位运算log2正解,这里下面也有个例子。
https://stackoverflow.com/questions/13654499/calculating-log-base-2
(上海-Weiqi “Xylt” Gu)
A: 范围小用查表~ 范围大用位移 ~ 不要用浮点运算~。(成都-xxp)
0x03 Virtual Reality
Q: 在开发Windows Mixed Reality时,编辑器会报错“RenderTexture.GenerateMips failed: render texture does not have mip maps (set useMipMap to true).”这个是一个bug吗?Unity版本为Unity2017.1.1f1, Unity2017.1.2f1, Unity2017.21f1。
A: 这的确是一个bug。细节可以查看:https://forum.unity.com/threads/beta-7-case-943170-windows-mixed-reality-far-clip-and-rendertexture-generatemips-error.488714/
这个bug已经修复了。但是当时还没有backport到2017.1和2017.2,也就是你用来测试的版本。
推荐你使用2017.4来测试和进行开发。2017.4版本作为一个长期维护版本,会持续修复已经知道的bug。
0x04 Graphics
Q: tonemapping和打包设置里colorspace是冲突的吗?是不是用tonemapping,colorspace需要改成线性?
A: 用tonemapping的话要用hdr,hdr最好和线性空间一起用,才能保证准确度。如果你的项目设置为gamma的话,postprocessing中的color grading会有一个警告的。
Q: 难道我理解错了。摄像机可以开HDR,但是打包到手机渲染设置里默认是不开的啊 我可不可以 用HDR算出来的结果 通过mapping 转换成ldr给手机显示
A: tonemapping的作用也是为了将一个高动态范围的颜色数据映射回可用颜色空间,为的是不被显示屏幕截断色彩。(北京-哎呀)
A: 因为显示器很少支持hdr,安卓手机更是565颜色居多。tonemap就是一个简单s曲线remapping。(深圳-topameng)
Q: 摄像机开启HDR并不表示移动端开启HDR吧。
A: 手机上不是固定fp16的,可以自己调,如果设置没有hdr backbuffer, 你摄像机上的标记一点用也没有。(深圳-topameng)
小贴士
这里可以和大家科普一下Graphic Setting中的各个tier和设备的对应关系:Graphics Settings内的Tier设置,在运行时会根据GPU来选择对应的Tier。应用相关的设置。具体各个Tier和设备的对应关系如下:
Tier 1:
Android - all devices that have support for OpenGL ES 2 only
iOS - all devices before iPhone 5S (not including 5S, but including 5C), iPods up to and including 5th generation, iPads up to 4th generation, iPad mini first generation
Desktops: DirectX 9, HoloLens
Tier 2:
Android - all devices with OpenGL ES 3 support,Vulkan
iOS - all devices starting from iPhone 5S, iPad Air, iPad mini 2nd generation, iPod 6th generation
AppleTV
Tier 3:
Desktops: OpenGL, Metal, DirectX 11+,Vulkan
具体也可以查阅相关文档。
Q: unity自带的屏幕射线反射效果一般,然后我找了好久,找到一个livenda lab开发的,居然离屏追踪,就是现在还没出成品。有好的推荐吗?
A: 可以参考群里@上海-CGBull在他的文章中的实现。
Unity_StochasticScreenSpaceReflection-实现篇:
https://zhuanlan.zhihu.com/p/38303394
(北京-小小光)
Q: 我这里想要扰动的方向是随机的怎么弄啊 在脚本里setfloat感觉是硬切的。
A: 从一张噪声贴图里读。
可以看看和失真效果相关的这篇博客:
https://zhuanlan.zhihu.com/p/37696836。(北京-破晓)
Q: 我想要的就是一团纹理在球上面随机方向位移,并且随时间变化。
A: 可以参考这篇文章:https://blog.csdn.net/panda1234lee/article/details/52085375
总之采样的时候以_Time作为种子取个噪声就行。(北京-破晓)
Q: 有人实现过手机上面能用的雪地踩踏效果吗?主美还想着要那种曲面细分的效果。。。战神 古墓丽影。。。
A: 思路并不复杂。简单的说, 就是Mesh变形。
至于古墓丽影的那个案例,之前@逍遥剑客 也在知乎上分享过。http://tombraider.tumblr.com/post/131825841425/dev-blog-snow-tech-and-houdini-simulations-mike
A: https://www.cnblogs.com/murongxiaopifu/p/7887614.html (北京-suzakul)
0x05 Editor
Q: 求教animationclip的inspector上显示的该资源的内存占用大小数据是如何获得的?
A: 你可以调用AnimationUtility.GetAnimationClipStats(clip)来获取某个clip的status,即AnimationClipStats类的实例,其中的size字段即inspector上显示的内存占用大小。可以参考下面的代码:
Assembly asm = Assembly.GetAssembly(typeof(Editor));
getAnimationClipStats = typeof(AnimationUtility).GetMethod("GetAnimationClipStats", BindingFlags.Static | BindingFlags.NonPublic);
Type aniclipstats = asm.GetType("UnityEditor.AnimationClipStats");
sizeInfo = aniclipstats.GetField("size", BindingFlags.Public | BindingFlags.Instance);
另外,c#部分的代码其实有开源的。你也可以参考github上的代码:https://github.com/Unity-Technologies/UnityCsReference/blob/3cfc6c4729d5cacedf67a38df5de1bfffb5994a3/Editor/Mono/Inspector/AnimationClipEditor.cs
0x06 Terrain
Q: 有人遇到过地形上用的纹理的纹理格式设置为astc,在手机上会崩溃的问题吗?我的unity版本是2018.1。
A: 遇到过这个问题。我下午也做了一些测试,这其实并非Unity2018上出现的新bug。我测试了一些2018之前的版本,比如2017.3.0p1,发现同样会由于在原生地形系统中使用astc格式纹理而出现crash。
不过这个问题我已经提交了Bug报告给开发,开发那边已经知道了。以后的版本会修掉。并且目前在原生地形中使用ETC2格式的纹理是没有问题的。
不过,我们其实可以通过crash日志信息,来看看程序是在哪一步crash掉的。同时,也可以在这里和大家分享一下如何通过crash日志来还原堆栈信息。
首先说明的是,我这里使用的Unity版本是2018.1.0f1,并且使用的Script Backend是Mono。
打开手机上的测试程序,查看程序crash时的日志:
在这份堆栈信息里,我们可以看到例如0049b647这样的数字,它们是在crash时,程序正在执行的方法的内存地址。每行的结尾则是所使用的库,这里是libunity.so。
但是,内存地址对我们来说显然没有什么意义,所以接下来我们需要将内存地址转换成我们可以看懂的内容。
在Unity 5.3.6之后的版本,我们都提供了libunity的符号表。
在Mac上,符号表的路径是:
/Applications/Unity/PlaybackEngines/AndroidPlayer/Variations/mono/Release/Symbols
在windows上,符号表的路径是:
C:\Program Files\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Symbols\armeabi-v7a\libunity.sym.so
需要注意的是,接下来我们使用的符号表版本一定要和你打包所使用的Editor版本一致。
有了符号表,接下来我们还需要NDK的addr2line工具。你可以在你的NDK目录下找到它:
toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-addr2line
OK,万事俱备,我们接下来就来解析一下第一条内存地址所对应的方法。
./arm-linux-androideabi-addr2line -f -C -e libunity.sym.so 0049b647
可以看到crash的方法是:
construct_block_size_descriptor_2d似乎还不太明显。我们再往回追。
原来是在做DecompressASTC相关的操作时crash了。
当然,这个bug已经提交了,并且会在以后的版本中修复的。现在大家可以在地形中使用ETC2格式的贴图。
0x07 Plugins
Q: 有没有大佬 知不知道 unity支不支持 64位动态库的调用?使用安卓平台。
A: 在Unity2018.1.0 Beta 2版本中提供了对 Android 64-bit ARM(experimental)的支持。
首先要将scripting backend设置为IL2CPP,之后就可以在Player Setting中选择ARM 64了。
另外,在刚推出的2018.2正式版中,对ARM64的支持应该已经很完善了。
0x08 Education
Q: 请问目前Unity提供的资质认证中,是只有“专家程序员认证”有培训课程吗?
A: 除了初级开发者考试有相应的课程外,其他证书的课程还在制作中,暂时还没有。初级的8月份才会搬到coursera,中文的现在网易云 51cto 已经有了。http://study.163.com/course/introduction/1005268010.htm
0x09 后记
这一周恰好也迎来了Unity2018.2的正式版本的发布,大家可以通过Unity Hub来直接下载:
也可以点击这个链接来下载:https://unity3d.com/cn/get-unity/update
好了,以上就是想和大家分享的几个在群里讨论的小问题。
再次,欢迎大家加入我们这个讨论干货的官方技术群,交流分享呀。
Unity官方社区交流群:629212643
Ref
这里是社区小伙伴们过去一周在群里分享的一些干货连接:
[1]Don’t Re-invent Finite State Machines: How to Repurpose Unity’s Animator:
https://medium.com/the-unity-developers-handbook/dont-re-invent-finite-state-machines-how-to-repurpose-unity-s-animator-7c6c421e5785
[2]Calculating Log base 2:
https://stackoverflow.com/questions/13654499/calculating-log-base-2
[3]【翻译】Shader · 冰:
https://zhuanlan.zhihu.com/p/37696836
[4]Shader特效——实现“噪声”【基于ShaderToy】【GLSL】:
https://blog.csdn.net/panda1234lee/article/details/52085375
[5]小随笔:利用Shader给斯坦福兔子长毛和实现雪地效果:
https://www.cnblogs.com/murongxiaopifu/p/7887614.html
[6]Dev Blog: Snow Tech and Houdini Simulations:
http://tombraider.tumblr.com/post/131825841425/dev-blog-snow-tech-and-houdini-simulations-mike
Unity官方社区交流群:629212643
还原堆栈信息,分析地形系统使用ASTC格式的纹理导致Crash的问题的更多相关文章
- Android jni Crash堆栈信息分析
如何定位Android NDK开发中遇到的错误 NDK编译生成的.so文件作为程序的一部分,在运行发生异常时同样会造成程序崩溃.不同于Java代码异常造成的程序崩溃,在NDK的异常发生时,程序在And ...
- Java内存泄漏分析系列之一:使用jstack定位线程堆栈信息
原文地址:http://www.javatang.com 前一段时间上线的系统升级之后,出现了严重的高CPU的问题,于是开始了一系列的优化处理之中,现在将这个过程做成一个系列的文章. 基本概念 在对J ...
- log显示error时的堆栈信息理解和分析
error显示的log堆栈信息,是从最深层(最内层)的堆栈信息开始由内向外打印的. error显示的log堆栈信息,是从最深层(最内层)的堆栈信息开始由内向外打印的. error显示的log堆栈信息, ...
- JVM源码系列:ThreadMXBean 打出堆栈信息原理分析
我们通常会使用工具jstack 去跟踪线程信息,其如何实现使用attach 的方式还是ptrace 的方式,这些可以去参考本人的博客的其他文章. 但这些方式都是外部使用的方式,如何直接使用java代码 ...
- jstack与jmap分析java堆栈信息
首先确定要查询的服务进程pid,可用ps -ef|grep 进程名称 jstack -l pid >> stack_info.txt,将此进程的堆栈信息导出到txt文件中 其中" ...
- delphi中获取调用堆栈信息
异常堆栈有利于分析程序的错误,Delphi的Exception有StackTrace属性,但是值为空,因为StackTrace的信息收集Delphi委托给了第三方组件来完成,真是脑子有毛病! 借助于m ...
- iPhone真机测试Crash信息分析
一.获取Crash Log的方式 在iOS开发过程,当应用已经打包,iPhone设备通过ipa的包安装应用后,在使用过程发现crash,那么如何获取crash日志呢,现提供如下四种获取crash日志的 ...
- Linux 如何使用gdb 查看core堆栈信息
转载:http://blog.csdn.net/mergerly/article/details/41994207 core dump 一般是在segmentation fault(段错误)的情况下产 ...
- Houdini技术体系 过程化地形系统(一):Far Cry5的植被系统分析
背景 在大世界游戏里,植被(biome)是自然环境非常重要的组成部分,虽然UE4里的也有比较不错的地形+植被系统,但相比国外AAA级游戏的效果,还是有不少的差距,简介如下: UE4的植被分为( ...
随机推荐
- swoft 源码解读【转】
官网: https://www.swoft.org/ 源码解读: http://naotu.baidu.com/file/814e81c9781b733e04218ac7a0494e2a?toke ...
- 许式伟:我与Go语言的这十年[转]
2017-12-18 许式伟 Go中国 2007 年 9 月 20 日,关于设计一门全新语言的讨论正式开始,这门全新的语言,就是后来的 Go.时至今日,Go 语言已经发布到 1.9 版本,走过了整整十 ...
- 。net加密解密相关方法
AES加密及解密 声明密钥级偏移向量--------/// <summary> /// 加密密钥 /// </summary> private static readonly ...
- 关于MySQL的1064错误
MySQL的1064错误是SQL语句写的有问题时出现的,即SQL的语法错误.笔者常常使用MySQL-python这个库来对MySQL进行操作,代码中报这个错误的一般是cursor.execute(sq ...
- IDEA 格式化代码快捷键冲突解决
转自https://blog.csdn.net/ckhmxhfhzt/article/details/72378537 大家都知道,在IDEA中格式化代码的快捷键为Ctrl+Alt+L .但是很多人发 ...
- 不吹不擂,你想要的Python面试都在这里了【315+道题】
写在前面 近日恰逢老男孩全栈8期毕业季,课程后期大家“期待+苦逼”的时刻莫过于每天早上内容回顾和面试题问答部分[临近毕业每天课前用40-60分钟对之前内容回顾.提问和补充,专挑班里不爱说话就的同学回答 ...
- 【莫比乌斯反演】BZOJ1101 [POI2007]zap
Description 回答T组询问,有多少组gcd(x,y)=d,x<=a, y<=b.T, a, b<=4e5. Solution 显然对于gcd=d的,应该把a/d b/d,然 ...
- 使用 NLog 给 Asp.Net Core 做请求监控
为了减少由于单个请求挂掉而拖垮整站的情况发生,给所有请求做统计是一个不错的解决方法,通过观察哪些请求的耗时比较长,我们就可以找到对应的接口.代码.数据表,做有针对性的优化可以提高效率.在 asp.ne ...
- python yield用法 (tornado, coroutine)
yield关键字用来定义生成器(Generator),其具体功能是可以当return使用,从函数里返回一个值,不同之处是用yield返回之后,可以让函数从上回yield返回的地点继续执行.也就是说,y ...
- hydra暴力破解ssh服务器密码
概述 我都没想到,第一次暴力破解服务器密码.竟然是对自己的单位服务器出手..囧,因为还没来得及找测试部要来服务器登录密码,测试部负责人已经下班走了.后来又联系不上,这要更新代码,怎么办..于是就对测试 ...