如何定位Unity死循环导致的完全卡死

如何定位Unity死循环导致的完全卡死

1)如何定位Unity死循环导致的完全卡死
​2)如何设定Unity AssetBundle单个包大小
3)MaterialPropertyBlock修改Stencil相关参数
4)线性空间中动作文件控制材质球颜色失真问题
5)DrawMeshInstancedIndirect在华为手机上失效


这是第240篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间10分钟,认真读完必有收获。

UWA 问答社区:answer.uwa4d.com
UWA QQ群2:793972859(原群已满员)

Script

Q:运行游戏时,在某些特定的情况下,Unity会突然卡死,看任务控制器里的Unity进程内存会持续飙升到很高的值。

由于目前游戏工程已经很大了,并且脚本众多(Lua+C#),出现这种情况时又没有异常日志,断点也断不到位置,也不知道是哪里出现的死循环异常了,这个问题卡了很久,没思路了,求解。

A1:经网友真木提示了这篇文章:https://www.cnblogs.com/lijiajia/p/10817407.html

通过debug.sethook这个函数来注册一个Hook的Handler,把每一行或者每个函数的调用都打印出来,就能知道死循环的位置了。这种方法可用于找Lua的死循环,假如是C#的死循环,需要其它方法。

感谢题主loy_liu@UWA问答社区提供了回答

A2:如果是C#的死循环,可以使用VS附加Unity调试,暂停整个游戏,然后切换到主线程,看看主线程当前运行到了哪一句。

感谢西元前的史莱姆@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/60346be9cfa35d5b53669644


AssetBundle

Q:Unity AssetBundle单个包大小多少比较合适?

A1:以前LZMA格式时,是建议小于1MB的,现在已经没有这个约束了。因为LoadFromFile+LZ4的加载速度已经非常快了。所以,文件大小更建议从热更新的角度出发,尽可能不要给热更新产生大麻烦即可。

该问答由UWA提供

A2:楼上说得对,读取速度已经不是问题,不要太小也不用太大,个人觉得1-10MB间差不多都可以,我个人是以使用的聚集性把每个包控制在几MB左右。

感谢徐军@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/6038b8a2cfa35d5b536696df


Material

Q:我在原生的Sprite-default Shader中加入了Stencil的相关设置,在编辑器状态下用MaterialPropertyBlock修改Stencil的Comp和Ref,在Inspector面板中该值已经被修改,但是在Frame Debugger中并未生效修改值,还是未修改前的设置,是不能用MaterialPropertyBlock改Stencil的相关参数吗?

A:可参考以下信息:

感谢羽飞@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/6035aee1cfa35d5b53669665


Rendering

Q:线性空间中动作文件控制材质球颜色失真问题。
以下是直接设置材质球的颜色显示:

以下是通过Animator动作文件设置材质球的颜色显示:

为什么不同呢?材质球是[HDR] Color有问题。(版本:Unity 2019.4.9f)

A:在线性空间中,写入到MaterialPropertyBlock的渲染颜色参数,在渲染时会转换到Gamma空间,即变成2.2次幂。

用动画修改材质的颜色,其实是向MaterialPropertyBlock中配置参数。所以在使用K材质球设计动画时,需要把颜色值的0.4545次幂写入到曲线中。

感谢张首峰@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/60336db2cfa35d5b53669632


Rendering

Q:Unity 2018.4.24的DrawMeshInstancedIndirect在华为手机上失效是为什么?我使用Testin的华为手机进行测试DrawMeshInstancedIndirect接口,试过的都是不行的,但是我用其他的手机就都可以。有遇到同样问题吗?

A1:贴上详细日志看看,然后把华为手机的设备信息贴上,最后问下是不是带麒麟CPU的华为机。

感谢Robot.Huang@UWA问答社区提供了回答

A2:由于驱动程序问题,对于仅具有OpenGL ES 3.0的Adreno GPU的Android设备禁用了GPU实例支持。

Graphics: GPU Instancing: Added support for Android with OpenGL ES 3.0 or newer. Note however that GPU instancing support is disabled for Android devices that have the Adreno GPU with only OpenGL ES 3.0, because of driver issues.

可以使用SystemInfo.supportsInstancing检测机器是否支持GPU Instancing,最保险的方式就是OpenGL ES 3.1及以上支持。

感谢郑骁@UWA问答社区提供了回答

A3:最后发现是华为Mali不支持SSBO的原因。

感谢题主halm@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/60338a6bcfa35d5b53669636

封面图来源于网络


今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在UWA问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。

官网:www.uwa4d.com
官方技术博客:blog.uwa4d.com
官方问答社区:answer.uwa4d.com
UWA学堂:edu.uwa4d.com
官方技术QQ群:793972859(原群已满员)