【厚积薄发】技术分享连载(十九)| Shader预加载| StreamingAssetPath...


【技术分享】是UWA推出的技术交流栏目,我们会定期将开发团队中反馈的常见问题加以总结并梳理在此,以供大家参考。
这是侑虎科技第56篇原创文章,欢迎转发分享,未经作者授权请勿转载。同时如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨。(QQ群465082844)
资源管理
Q:我项目的UnityShaderCache目录下有300个文件
(Application.persistentDataPath/cache/UnityShaderCache) 
且不是一次生成, 而是随着游戏进行而产生的。为了在游戏第一次进行时把所有Shader都编译来减少卡顿,我把用到的Shader加入到 Always Included Shaders中, 并在游戏开始时调用了 Shader.WarmupAllShaders,也尝试把Shader打个包一起加载出来 ,然后Shader.WarmupAllShaders,但是效果并不理想。有什么好的解决方案吗?
另一个困惑:已加到 Always Included Shaders 中的。 还需要在加载一次么?
A:首先 Shader. WarmupAllShaders 并不影响 Shader 的加载,因为该函数的作用是将所有已加载的 Shader 都做一次快速渲染(渲染单个像素,GPU 在首次使用某一个 Shader 时会有额外开销,Warm 相当于是将这部分开销提前)。所以可以通过AssetBundle.LoadAll等接口预加载 AssetBundle 中的 Shader。而对于 Always Included Shaders 中的 Shader 则可以通过 Shader. Find 来预加载。
图形渲染
Q:某个Shader里设置了Culling Off,会影响到后面所有Shader的渲染状态么(假设后面不再设置Culling)?

A:一次 Draw Call 提交所相关的 Render State 是不会影响到下一次的渲染状态的。如果不在 Shader 中显示指定 Cull 模式,则会使用默认的 Cull Back。
资源管理
Q:StreamingAssetPath 和 PersistantDataPath下可以不Load AssetBundle ,直接放资源Load吗?
A:这是可以的,但非常有限。因为不通过 AssetBundle 加载,只能通过 Unity 提供的有限的接口来直接加载外部资源,如通过 WWW.audioClip 直接加载 mp3文件,通过 WWW.texture 直接加载 jpg 文件等。由于不是内部资源格式,其加载效率通常较低,jpg 还涉及软解操作非常耗时。因此一般情况下我们都不建议通过这种方式来加载资源。
图形渲染
Q:项目在发布时,Player Setting中勾选的这个选项,对于已经打包并且放到了Streaming Assets中的AssetBundle文件有效果吗?模型资源里有个 选项,是否能达到同样的效果?
A:理论上 Optimize Mesh Data 是 Build Player 或者 Bundle 时才生效的,所以之前打好的 Bundle 就没效果了。另外,两个选项的效果是不同的,后者是调整面片排序的。
图形渲染
Q:我们的动画是放在FBX文件里的(如下图)

这样做导致打包的时候把一些无用的文件也打进AssetBundle包里了,实际上我们只想使用最后这个动画文件。但在编辑器里选中FBX文件里的动画文件时却没有AssetLabels这个窗口,设置不了AssetBundle Name。

是不是只能用代码设置?还是意味着不能设置AssetBundle Name,只能把动画文件提取出来,类似下图这样单独的一个文件?

A:在Unity 5.x 的打包机制下确实无法手动为 FBX 下的 Mesh 或 AnimationClip 单独资源设置 AssetBundle Name。因此,如果需要将这部分资源抽出来作为依赖包,目前确实就需要先通过脚本将这部分资源提取出来了。
今天的分享就到这里。也欢迎热爱进步的你加入UWA的QQ群(465082844),也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。  比起闭门造车,我们更乐意与大家各抒己见,畅所欲言;比起形而上的泛泛而谈,我们更乐意与大家直击痛点,对症下药。
近期活动:满满三小时的优化干货 ,hold得住你就来!

推荐阅读,更多技术分享,请阅读原文,移步官网Blog页面!

博观约取 |《六龙争霸》案例精讲

厚积薄发 | 性能优化,进无止境——加载篇(一)

厚积薄发 | 性能优化,进无止境---内存篇(下)

厚积薄发 | 性能优化,进无止境---CPU篇

到顶部