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

侑虎科技 · 2021年04月21日 · 1577 次阅读

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问答社区提供了回答

AssetBundle

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

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

该问答由 UWA 提供

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

感谢徐军@UWA问答社区提供了回答

Material

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

A:可参考以下信息:

感谢羽飞@UWA问答社区提供了回答

Rendering

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

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

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

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

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

感谢张首峰@UWA问答社区提供了回答

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 问答社区提供了回答

封面图来源于网络


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

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

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册