技术分享连载(十九)

技术分享连载(十九)

本期话题:Shader预加载、StreamingAssetPath、PersistantDataPath...这是侑虎科技第56篇原创文章,欢迎转发分享,未经作者授权请勿转载。同时如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨。

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


资源管理

Q1:我项目的UnityShaderCache目录下有300个文件(如下),且不是一次生成, 而是随着游戏进行而产生的。

Application.persistentDataPath/cache/UnityShaderCache

为了在游戏第一次进行时把所有Shader都编译来减少卡顿,我把用到的Shader加入到 Always Included Shaders中, 并在游戏开始时调用了 Shader.WarmupAllShaders,也尝试把Shader打个包一起加载出来 ,然后Shader.WarmupAllShaders,但是效果并不理想。有什么好的解决方案吗?
另一个困惑:已加到 Always Included Shaders 中的,还需要再加载一次么?

首先 Shader. WarmupAllShaders 并不影响 Shader 的加载,因为该函数的作用是将所有已加载的 Shader 都做一次快速渲染(渲染单个像素,GPU 在首次使用某一个 Shader 时会有额外开销,Warm 相当于是将这部分开销提前)。所以可以通过AssetBundle.LoadAll等接口预加载 AssetBundle 中的 Shader。而对于 Always Included Shaders 中的 Shader 则可以通过 Shader. Find 来预加载。


图形渲染

Q2:某个Shader里设置了Culling Off,会影响到后面所有Shader的渲染状态么(假设后面不再设置Culling)?
UWA Tech Doc

一次 Draw Call 提交所相关的 Render State 是不会影响到下一次的渲染状态的。如果不在 Shader 中显示指定 Cull 模式,则会使用默认的 Cull Back。


资源管理

Q3:StreamingAssetPath 和 PersistantDataPath下可以不Load AssetBundle ,直接放资源Load吗?

这是可以的,但非常有限。因为不通过 AssetBundle 加载,只能通过 Unity 提供的有限的接口来直接加载外部资源,如通过 WWW.audioClip 直接加载 mp3文件,通过 WWW.texture 直接加载 jpg 文件等。由于不是内部资源格式,其加载效率通常较低,jpg 还涉及软解操作非常耗时。因此一般情况下我们都不建议通过这种方式来加载资源。


图形渲染

Q4:项目在发布时,Player Setting中勾选的这个选项,UWA Tech Doc对于已经打包并且放到了Streaming Assets中的AssetBundle文件有效果吗?模型资源里有个UWA Tech Doc选项,是否能达到同样的效果?

理论上 Optimize Mesh Data 是 Build Player 或者 Bundle 时才生效的,所以之前打好的 Bundle 就没效果了。另外,两个选项的效果是不同的,后者是调整面片排序的。


资源管理

Q5:我们的动画是放在FBX文件里的(如下图)
UWA Tech Doc
这样做导致打包的时候把一些无用的文件也打进AssetBundle包里了,实际上我们只想使用最后这个动画文件。但在编辑器里选中FBX文件里的动画文件时却没有AssetLabels这个窗口,设置不了AssetBundle Name。
UWA Tech Doc
是不是只能用代码设置?还是意味着不能设置AssetBundle Name,只能把动画文件提取出来,类似下图这样单独的一个文件?
UWA Tech Doc

在Unity 5.x 的打包机制下确实无法手动为 FBX 下的 Mesh 或 AnimationClip 单独资源设置 AssetBundle Name。因此,如果需要将这部分资源抽出来作为依赖包,目前确实就需要先通过脚本将这部分资源提取出来了。


【技术分享】是UWA推出的技术交流栏目,我们会定期将开发团队中反馈的常见问题加以总结并梳理在此,以供大家参考。