Shader合并与Variant

前言

  • 写这个的起因是因为看了唐建伟大佬在UWA上发表的文章合并Shader系列_如何合并渲染状态。看完后受益良多,但是也对文中这样合并shader会不会产生shader的变种(shader variant)有所担心,因此在UWA的问答上提出了问题,最后唐建伟也做出了回答,经过大佬授权在这里根据回答进行一些总结,想看原文的可以直接点击链接。

每天一点UWA:第十二周

UI

对于UGUI文字花屏问题,有什么推荐的解决方法吗?

每天一点UWA:第十一周

字体

优化字体资源

方向:内存和数量峰值

  • 主要是因为在字体资源的使用过程中采用了不同的方式。比如一开始的UI没有考虑使用AssetBundle,从而直接从Resources或者其它文件夹加载了字体资源。而后面的UI又依赖了AssetBundle中的字体,虽然也没有主动load,但是因为unity在load asset的时候会自动加载(有待验证)所以导致字体资源又被加载一次。从而峰值数量会不止一个。
  • 内存:很多情况下我们对于一个字体库中的字体只是用了个别的,但是却加载了整个字体库。

每天一点UWA:第十周

AssetBundle

AssetBundle中的脚本

  • 首先,需要说明的是,脚本本身的内容是不会被打包到AssetBundle文件中的,AssetBundle文件储存的仅是脚本的索引信息。因此,即便有多个AssetBundle中都存在UIAtlas这一脚本索引,对堆内存也几乎是不产生影响的,且不会产生冗余问题。
  • 其次,脚本被当做资源且会产生依赖这一现象,仅在Unity 4.x版本中出现,而在Unity 5.0以后,脚本之间将不会产生依赖关系。因此,如果你目前还在使用Unity 4.x版本进行开发,那么依赖关系打包时确实需要注意这个问题,即依次Push A和B进行打包时,如果AssetBundle之间存在相同脚本,那么B会对A的脚本产生依赖。

每天一点UWA:第九周

AssetBundle

关于AssetBundle依赖的问题

  • 如果Panel A和Panel B,它们均依赖一个共享Atlas C。如果在加载完AtlasC后卸载它所在的AssetBundle,再创建A和B,此时会失败。因为他们的依赖关系在AssetBundle上。

请教一下,SerializedFile的卸载规则是什么呢?会跟随这AssetBundle一起卸载么?

  • 绝大部分的SerializedFile均由AssetBundle产生,当AssetBundle被卸载时,与其对应的SerializedFile也将销毁。

每天一点UWA:第八周

AssetBundle

打包AssetBundle的时候,我发现切换场景时,即使打同一个场景的AssetBundle,它们的Hash值都是不一样的,可能是什么原因造成的呢?

  • 目前很可能是Shader Stripping造成的,其原理可见文档
  • 简单来说就是根据当前场景对Shader进行简化,因此如果打包时包含的场景的Lightmap或Fog设置不同,打出来的AssetBundle包也有可能是不同的。可以尝试通过把Graphics Settings中的Shader Stripping设置进行修改来避免这个问题。

Prefab目前,只能通过Unload(True)和Resources.UnloadUnusedAssets卸载。

每天一点UWA:UI优化小结

说明

  • 经过一个半月的学习,对UI的优化有了一些心得,同时也希望把零散的知识点总结到一起,因此有了这个专题。

那些需要关注的性能指标函数

UGUI参考的函数

  • 1、Canvas.SendWillRenderCanvases()
    该API为UI元素自身发生变化(比如被Enable或者被缩放,移动并不算)时所产生的调用。发生在canvas被渲染之前。

  • 2、Canvas.BuildBatch
    该API为UI元素合并的Mesh需要改变时所产生的调用。通常之前所提到的Canvas.SendWillRenderCanvases()的调用都会引起Canvas.BuildBatch的调用。另外,Canvas中的UI元素发生移动也会引起Canvas.BuildBatch的调用。

每天一点UWA:第七周

UI

NPOT采用 ToLarger 的模式拉成POT,如果是UI界面(开启Pixel Perfect)的话,可能显示时会有较大视觉损失。

在Unity 5.x版本下,我们在用UGUI的过程中发现它把图集都打进了包里,这样就不能自动更新了,请问图集怎么做自动更新呢?

  • 在Unity 5.x中UGUI使用的Atlas确实是不可见的,因此无法直接将其独立打包。
  • 建议,可以把Packing Tag相同的源纹理文件,打到同一个AssetBundle中(设置一样的AssetBundle Name),从而避免Atlas的冗余。同时这样打包可以让依赖它的Canvas的打包更加自由,即不需要把依赖它的Canvas都打在一个AssetBundle中,在更新时直接更新Atlas所在的AssetBundle即可。

每天一点UWA:第六周

AssetBundle

这是一个很长的问题:

字体作为多个资源的依赖包,会在游戏中被加载多次。我们现在有个问题,AssetBundle A资源依赖于这个字体,加载A的时候加载了一份字体,然后B资源也依赖这字体,而后加载B的时候我们没有去重复加载字体,这时候发现B资源上出现了字体丢失的现象。

每天一点UWA:第五周

AssetBundle

shader加载

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

Update your browser to view this website correctly. Update my browser now

×