Shader.CreateGPUProgram的疑惑

Shader.CreateGPUProgram的疑惑

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

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

本期目录:

  • 关于Shader.CreateGPUProgram的疑惑
  • 关于Shader.Parse的优化标准
  • 使用AVProVideo1.7.4在iPhone上会出现一层红色的蒙版
  • Unity 2019升级产生的问题
  • 如何理解AlwaysAnimate

Shader

Q:项目中暂时没有全部Shader提前加载,进入副本会触发Shader.CreateCPUProgram高耗时。看了UWA博客上关于这个函数和Unity官方WarmupAll的API,有若干疑问。

1、API上WarmupAll提到Calling this function will perform dummy one-invisible-triangle rendering with all variants of all currently loaded shaders. This can take some time but helps to avoid hiccups in the future。提到关于执行一个虚拟不可见三角形呈现,避免后面开销大,这个是可以避免CreateCPUProgram开销吗?UWA博客建议是在场景切换的时候让物体闪现一下来处理这个问题,如果只能用闪现,那是一个物体上挂全部Shader来解决吗?

2、API上提到If you use Resources.Load to load shaders, you will need to call WarmupAllShaders again. 没有提到如果用AssetBundle的形式加载会怎样。如果用AssetBundle加载,是否还需要WarmupAllShaders?UWA上关于Shader加载的博客是不建议使用AssetBundle的形式来加载ShaderVariantCollection,版本是5.3,现在5.6是否可以使用AssetBundle的方式来加载ShaderVariantCollection呢?

A:1、如果能够接受首次安装包运行时解析所有Shader,建议就用WarmupAll了,这样所有的Shader都编译cache了,再次运行游戏就不存在由于Shader导致的卡顿了,目前来说应该也有很多游戏是这么处理的吧。而你说的一个物体挂全部Shader来闪现一下,那它和WarmupAll其实是没区别的,UWA博客上的建议也仅是说让你在切场景时按需来闪现一下而已。

2、UWA上似乎没有不建议使用AssetBundle的形式来加载SVC吧;一般来说,使用SVC是和它的Shader打进同一AssetBundle的,Load AssetBundle的形式只会加载Unity认为的默认的Shader变体,这个时候其实是会产生Shader.CreateGPUProgram的消耗的,等你Warmup的时候,编译你收集到的变体,而这时同样会产生Shader.CreateGPUProgram的开销。

感谢李星@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5d70da3280d96a06d776ddd1


Shader

Q:我们这里显示Shader总数是102,然后解析报告里面显示Shader.Parse次数也是102这个不是对的吗?但是我看你们的标准写的是5次,这个看不太懂,这个5次是指登录后进入游戏的次数吗?

A:在我们的性能简报里其实有关于这里5次的解释:


即调用帧数<5,而非调用次数。

正如我们的优化建议中提到的,由于Shader.Parse对应的是Shader的加载和解析,所以建议在游戏一开始的加载阶段完成对大部分常用Shader的加载和解析,并一直缓存,避免在游戏过程中动态加载Shader造成卡顿。

这里之所以用调用帧数作为性能监控指标也是这个意思,并不是指调用次数。

该回答由UWA提供,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5d76030e91262623a9fc7453


Video

Q:使用AVProVideo1.7.4在iPhone上会出现一层红色的蒙版。安卓正常,使用的是网络连接,视频可以正常播放,就是会出现红色的蒙版。

A1:这个帖子倒数第二个答案提到了在视频播放期间通过限制帧率来规避这个问题:

QualitySettings.vSyncCount = 2;

题主可以试一下看看。
感谢张迪@UWA问答社区提供了回答

A2:把AVProVideo Demo里面的Shader放在Resources文件夹下直接打包,或者加入到Always include shaders下也可以解决。

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


版本升级

Q:最近新开项目,将之前项目升级到了Unity 2019.2.1f1,发现继承于UIBehaviour,并且编译进客户端DLL中的类,再将DLL导入进Unity工程中后,都无法正常使用,直接将代码文件放入Unity工程则无此问题。

目前猜测是Unity Bug,除了将工程文件全放进Unity项目目录以外,还有什么办法可以尝试吗?

开发环境:Unity 2019.2.1f1 .net 4.5 / 3.5 (都有尝试,全失败)。

测试用工程,UIEmptyGraphic继承UIBehaviour,其它类直接或间接继承MonoBehaivour。


正常表现的类,继承MonoBehaviour


继承UIBehaviour

导入Unity工程中,只能看到继承MonoBehaivour的类。


在component中也无法查看到继承与UIBehaviour的类。

A:临时用了一个办法,把UnityEngine.UI.Dll手动添加进Unity工程,从Unity工程中PackageManager里删除掉内置的Unity UI,然后给Prefab文件中引用到的GUID重新设为加入的UnityEngine.UI.Dll文件的GUID。

不知道是不是Unity自身Bug,等新版本再看。

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


Animation

Q:AlwaysAnimate模式的Animator数量是什么意思?对于动画模块的影响有多大,一般通过何种方面来排查确保这个数值是合理的?

A:官方API解释请查看:https://docs.unity3d.com/ScriptReference/AnimatorCullingMode.html

这个选项主要影响的是当Animator组件在屏幕外(Culling)时的状态。

如果选择AlwaysAnimate,则Animator组件会一直在计算更新,从而导致Animators.Update的耗时偏高。如果项目中有关注到Animators.Update耗时过高,就可以关注一下这一类的Animator数量是否过多。

该问答由UWA提供,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5d76032691262623a9fc7455

封面图:Unity-Shader
多个Unity着色器。


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

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