首页 > 其他分享 >Unity5.x shader打包AssetBundle总结

Unity5.x shader打包AssetBundle总结

时间:2024-01-30 11:33:22浏览次数:32  
标签:ab shader 编辑器 AssetBundle Unity5 com 打包

unity5.x  shader打包AssetBundle总结

最近比较忙,好久没有更新博客了,新项目切换到unity5.x后使用了新的打包机制,在打包shader的时候遇到了一些问题,这里来记录一下吧。

 

在上一个项目中,我们使用unity4.7,对于shader并没有进行依赖打包,而是由unity打包到了每个用到的AssetBundle中去,其实这样是“很不科学的”。这样不仅增加了ab的总体积,而且还会在运行时产生很多的shader实例,增加很多的显存占用。所以我们决定把自定义的shader打包成一个AssetBundle。

 

用到的工具:

1、UnityStudio:https://github.com/Perfare/UnityStudio/releases

这是一个解包AssetBundle的工具,可以查看和导出ab中的资源。

2、Unity自带的profiler

 

下面是一些尝试和结果分析:

 

一、不进行依赖打包(不需要设置GraphicsSetting,不给自定义shader设置AssetBundle Name)

这种情况unity5.x还是与unity4.x一样,把shader打包到每一个使用它的AssetBundle 中去,这样就会同时存在多个一样的shader,并在运行时产生多个shader实例。

如下图:

这个Character是我们自定义的一个shader,在运行时产生了多个实例:

 

使用UnityStudio解包一个ab可以看到,我们自定义的shader ParticlesAlphaTintColor被打包到ab中:

 

 

 

打包后的运行测试结果如下:

1、编辑器是pc平台的时候,打出来的包在编辑器里运行是正常的。

2、编辑器是安卓时,打出来的包在编辑器里运行显示粉红(查看材质可以发现并不是丢失材质和shader),但在手机正常。

这是为什么呢?这是因为以安卓为平台打包的时候被打包的shader被编译成安卓平台的版本,在unity编辑器中运行会发生异常。这是从4.x到5.x一直有的问题。

解包后我们可以看到不同平台编译出来的shader subProgram不同。

Pc:

 

安卓:

 

 

二、依赖打包(将shader设置AssetBundle Name打包)

使用这种方式,需要将shader添加到GraphicsSetting-> always included shader设置中,否则shader也会显示粉红。注意要在设置Graphics之后把shader重新打包,在能生效。

文档中也有说到:https://docs.unity3d.com/Manual/class-GraphicsSettings.html

 

 

测试结果如下:

1、编辑器是pc平台的时候,打出来的包在编辑器里运行是正常的。

2、编辑器是安卓时,打出来的包在编辑器里运行显示粉红(查看材质可以发现并不是丢失材质和shader),但在手机正常,原因同上。

 

再使用profiler查看,可以发现shader可以被物体共用了,随着物体数量的增加也不会产生多个shader实例。(下图有两个Character是因为编辑器中ShaderVariantCollection跟踪到了这个shader,也算一个引用)

 

这时解包模型的ab,也不会看到shader被打进ab中了,它们只存在与自己的ab包中。

 

三、注意事项

1、细心的朋友会发现,一中我们profiler中看到的Character是45.7k,而二中是334k,这是因为Character是一个多变体的shader,而加入了GraphicsSetting-> always included shader后,会将它所有的变体打包到游戏中。

 

2、在测试打包的过程中我发现一个有趣的现象--- unity5.4和4.x打包后的shader解包(非依赖打包)出来看起来不一样:

 

5.4没有看到代码,而是看到GPUProgramID

 

而4.7是直接看到代码

 

 

结合最新更新的unity5.5的更新日志,似乎可以看出点端倪:

https://Unity3D.com/cn/unity/whats-new/unity-5.5.0

---Shaders: Shaders are now exported to the Unity player completely in binary. There is no Shader text string and parsing in run time.

 

3、关于untiy内置shader

如果没有设置到GraphicsSetting-> always included shader中,那么会打包到依赖它的ab中,如果设置了就不会打包进去。而是再构建的时候,就导入到你的游戏。

 

4、手动设置shader 加入GraphicsSetting-> always included shader很麻烦,怎么办?

其实是可以使用代码设置的:

来自:http://www.hiwrz.com/2016/04/18/unity/175/

 

[csharp]  view plain  copy        
  1. [MenuItem("Test/测试设置included shader", false, 11)]  
  2.  public static void TestIncludedShader()  
  3.  {  
  4.      string[] myShaders = new string[1]{  
  5.          "Legacy Shaders/Diffuse"  
  6.      };  
  7.    
  8.      SerializedObject graphicsSettings = new SerializedObject (AssetDatabase.LoadAllAssetsAtPath ("ProjectSettings/GraphicsSettings.asset") [0]);  
  9.      SerializedProperty it = graphicsSettings.GetIterator ();  
  10.      SerializedProperty dataPoint;  
  11.      while (it.NextVisible(true)) {  
  12.          if (it.name == "m_AlwaysIncludedShaders") {  
  13.              it.ClearArray();  
  14.    
  15.              for (int i = 0; i < myShaders.Length; i++) {   
  16.                  it.InsertArrayElementAtIndex(i);  
  17.                  dataPoint = it.GetArrayElementAtIndex (i);  
  18.                  dataPoint.objectReferenceValue = Shader.Find(myShaders[i]);  
  19.              }  
  20.    
  21.              graphicsSettings.ApplyModifiedProperties ();  
  22.          }  
  23.      }  
  24.  }  


 

5、加入AlwaysIncludedShaders的shader是开始游戏的时候就全部编译了吗?

答案是不会,加到always include 的shader,会将shader的所有变体打包到游戏,用到的时候才会加载用到的变体到内存!需要预加载变体可以使用:ShaderVariantCollection

相关文档:https://docs.unity3d.com/Manual/OptimizingShaderLoadTime.html

 

值得注意的是unity5.x内置的  Standard shader是一个有成千上万变体的shader,要谨慎的把它加入到GraphicsSetting-> always included shader,因为1中的原因,会使得你的包体非常大,打包也非常耗时。至少在我测试下是一直卡在这个界面到下班都没有响应。。

文档里面也有提到:

 

6、关于shader加载和预热的一些资料:

Unity - Manual: Optimizing Shader Load Time

https://docs.unity3d.com/ScriptReference/ShaderVariantCollection.html

http://www.seven-fire.cn/archives/174

https://www.zhihu.com/question/30087487

https://zhuanlan.zhihu.com/p/21949663

标签:ab,shader,编辑器,AssetBundle,Unity5,com,打包
From: https://www.cnblogs.com/gangtie/p/17996758

相关文章

  • 标准光照Shader
    思路《Shader入门精要》看到第九章,试着结合前面的知识实现一个标准光照模型,采用Blin-Phong模型,分为三大部分环境光,漫反射,高光反射。实现过程中加入凹凸效果,阴影效果。注释部分是透明效果,采用透明度测试的方法实现。具体细节见代码代码//UpgradeNOTE:replaced'mul(UNITY_MAT......
  • Shader实现翻书效果
    原理翻书这个过程可以看成是平面上的点都绕z轴旋转,但是直接这样写的话会出现问题。因为旋转轴是在中间的,所以我们在旋转之前要把点向左偏移5个单位这样旋转轴就到了最左边,然后再乘上旋转矩阵得到旋转之后的位置,再向右边偏移5个单位还原一下。这样实现的太生硬了,所以带入正弦函数......
  • Unity:Couldn't open include file 'Packages/com.unity.render-pipelines.universal/S
    初学Shader,Unity报错↑,总之是找不到ulsl的Core文件,网上找的其他解决方案例如删除文件夹再生成或者改变shader的某些属性,但是根本找不到。最终找到原因是项目类型不同,要把传统3D升级成URP项目。解决办法:安装UniversalRP拓展1.在unity中打开需要升级的场景,SaveAs一份并打开该场......
  • shader 一步一步 日记累月 ----极坐标
    学习shader就是在考察数学知识极坐标复习一下极坐标的点的位置是靠theta(角度)和r(距离)两个信息(二维空间)shader://直角坐标转极坐标方法float2RectToPolar(float2uv,float2centerUV){uv=uv-centerUV;/......
  • Cocos Creator 3.8 开发2D水面波纹Shader
     使用cocosCreator3.8做了一个游戏开中常用的2D的波浪水面,把技术点给记录一下,并提供完整的Shader代码。先上效果:   2D波浪的基本技术原理 2D水面波纹的主要原理就是给定一个正选波的边界,在范围内的片元uv就显示,在范围外的片元uv就不显示。同时利用正弦波表达式:......
  • Shader随笔02
    GlobalBake这里是简化Lighting.cginc的UnityGI_Base函数以及AutoLight.cginc的LightingLambert来实现bake贴图采样(没开灯光)其中,Mixed是重点DirectionalMode是重点Light组件的Mode需要调成Mixed完成以上内容可以在使用unity标准Shader的情况下看的bake情况自定义cginc......
  • ProjectorMultiply.Shader 非固定管线版本
    //UpgradeNOTE:replaced'_Projector'with'unity_Projector'//UpgradeNOTE:replaced'_ProjectorClip'with'unity_ProjectorClip'Shader"Projector/Multiply"{Properties{_ShadowTex("......
  • Unity3d Vertex/Fragment Shader添加Shadow
    Shader"ZX/BaseVertFragmentShadow"{Properties{_DiffuseTexture("DiffuseTexture",2D)="white"{}_DiffuseTint("DiffuseTint",Color)=(1,1,1,1)}SubShader{......
  • Unity3D Shader在GPU上是如何执行的详解
    Unity3D是一款广泛应用于游戏开发的跨平台开发引擎,它提供了丰富的功能和工具来帮助开发者创建高质量的游戏。其中一个重要的功能就是Shader,它可以用来控制对象的渲染效果。在Unity3D中,Shader是在GPU上执行的,那么它是如何工作的呢?本文将详细解释Unity3DShader在GPU上的执行过程,并......
  • Unity3D Shader Compute Shader基于GPU的并发计算详解
    在游戏开发中,计算密集型的任务通常需要耗费大量的CPU资源,这可能导致游戏性能下降,影响玩家的游戏体验。为了解决这个问题,Unity3D引入了ShaderComputeShader技术,它使用GPU进行并发计算,将一些计算密集型任务从CPU转移到GPU上执行,以提高游戏的性能和效率。本文将详细介绍Unity3DSha......