技术分享连载(七十一)

技术分享连载(七十一)

本期我们聚集了这些话题:Always Included中的Shader、AssetBundle中的Shader Feature、粒子系统中Mesh UV信息丢失...


我们将从日常技术交流中精选若干个开发相关的问题,建议阅读时间15分钟,认真读完必有收获。如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨。
UWA QQ群:793972859
UWA 问答社区:answer.uwa4d.com


资源管理

Q1:最近的项目使用了AssetBundle的资源管理方案,对于Shader的部分全部放到了Always include里面(这里不仅是系统内置的Shader,还包括自定义的Shader),然后打Bundle资源的目录里是不包含任何Shader的。但是现在发现,Shader还是被作为依赖关系打进了最终的Bundle里,而且造成了冗余,问问大家有没有遇到这个情况呢?我的Unity版本是5.3.4f1。

首先,只要资源在工程里并且需要用到它,就会被打包进AssetBundle。然后Always include里built-in Shader不会被打包进AssetBundle,这是一个特例。这个特例仅限于没有放到工程里的部分,有些项目会自己下载built-in Shader放到工程里,这样的Shader和自己写的没有区别,也会被打包。 最后,你遇到的问题是正常现象,需要你们通过资源管理的策略避免掉。

此问答来自于UWA 问答社区,感谢 Walker的回答。
https://answer.uwa4d.com/question/595c56283a75401430781007
如您对该问题仍有疑问,可以转至社区进行进一步交流。


资源管理

Q2:自定义Shader放入Always include里面,造成Bundle 资源冗余。项目中的某一个自定义的Shader 使用了Shader feature ENABLE_CLIP,Shader被打进最终的Bundle包的时候,这个Shader feature 不起作用了,是因为这个Shader Variant没有被打入最终包吗,官方文档里的说明是:
the only difference is that unused variants of shader_feature shaders will not be included into game build. So shader_feature makes most sense for keywords that will be set on the materials, while multi_compile for keywords that will be set from code globally.
但是我确实有个材质是使用了这个Shader Feature的,为什么这个Shader Variant 没有进入最终的Bundle包呢?

据了解,Unity官方有在英文论坛里提到Asset Bundle team正在解决这个问题。如果不将Shader对应的Material与Shader一同打包,当前另外的解决方案包括:

  • 使用dummy materials / ShaderVariantCollection 与shader打在同一ab内。
  • 使用multi_compile替换shader_feature。
    研发团队可以参考以上方式进行下尝试。

此问答来自于UWA 问答社区:
https://answer.uwa4d.com/question/595c9ec472c96d467bd7cfad/
如您对该问题仍有疑问,可以转至社区进行进一步交流。


资源管理

Q3:我把FBX和粒子系统分开打包了。加载的时候先加载FBX文件,然后再加载粒子系统,结果那些粒子系统是Mesh模式的时候,它们的UV会消失。怎么办呢?开了Read/Write able就不会消失。不分开打包也不会消失,这种情况如何破?

建议考虑在 FBX 的 AssetBundle 里再放一个带粒子系统,并且引用这个 Mesh 的 Prefab(但不去加载,也不去使用它),只是为了让 UV 可以被正确获得。 理论上这样做的话,基本不需要修改原来的加载方式,也不用开Read/Write。


渲染

Q4:想问下,下图这一项是指渲染透明物体的渲染消耗么,主要是提交DrawCall是么,现在游戏的GPU消耗在20ms以内Xcode Profiler结果。但是有些粒子系统比较耗CPU,就是这个涨得比较厉害,峰值有7~8ms,请问有没有什么优化建议?
请输入图片描述

首先,需要说明的是,Draw Call是CPU端的耗时开销,XCode上GPU上的开销统计与其关系不大。其次,图中红框所示确实表示的是半透明物体渲染在CPU端的耗时,其不仅与Draw Call数量相关,也和渲染State的切换相关(从图中可以看出,项目使用的是Unity 4.x版本,对应的需要关注Shader.SetPass的开销)。再次,粒子系统的耗时开销很高,如果还是持续在7~8ms左右,那么研发团队关注较高耗时处的游戏场景,并控制粒子系统的使用数量,粒子系统的优化并没有“神奇”的方案,目前研发团队需尽可能控制粒子系统的使用数量,研发团队可以参考此文:UWA性能报告解析—粒子系统篇


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