Unity Shader Parse

菜单工具:Tools/MenuItem
[MenuItem(“Tools/MenuItem”)]

Editor目录下
资源目录的工具:MenuItem
[MenuItem(“Assets/MenuItem”)]
public static void CreatMeshAsset()
{
GameObject go = GameObject.Instantiate(Selection.activeGameObject)
Mesh mesh = go.GetComponent().mesh;
AssetDatabase.CreateAsset(mesh , “Assets/” + name + “.asset”);
GameObject.DestroyImmediate(go)
}

C#
GameObject go = new GameObject()
go.AddComponent().mesh = ab.LoaddAsset() as mesh;

shader.parse()把shader及其变体发送到GPU调用:加载 prefab、material、shader 形式的assetbundle时和Shader.Find会出现;
原则上只有是有shader加载或创建都会执行

因此,重新从代码构建prefab和其meshfilter以及meshrender,可以避免Shader.Parse的调用

使用自己的FindShader 替换Shader.Find 注意在其shader ab确保在游戏整个过程中独立加载,且不会被依赖项说卸载

===========================================================================

AssetBundle ab = LoadAssetBundle(“shader”);
Object[] obs = ab.LoadAllAssets();

Shader sh = obs[i] as Shader;
if(sh == null)
{
ShaderVariantCollection sv = obs[i] as ShaderVariantCollection;
if(sv !=null)
{
sv.WarmUp()
}
}

注意:
1、AB热更Shader,使用自己的Shader加载模式
Shader AssetBundle加载后需要保存供后续材质创建使用

2、Shader.Find争对预加载和Resources中的Shader

Shader优化:
1、控制shader编译平台
2、ShaderVariantCollection控制变体
3、Edit->project settings->graphics里的shaderstriping优化shader
4、在卸载依赖于shader ab所有对象后,对shader assetBundle Unload(true),可以清掉shader

Shader WarmUp功能:
1、Shader变体初始化,以防创建使用到该Shader导致卡顿
2、清理掉对于Warmup的Shader的ab文本文件
官方:
通常,首次需要着色器时,图形驱动程序才会实际准备着色器。 但是,首次使用先前未使用过的着色器渲染某个对象时, 可能会出现暂时性中断,因为驱动程序需要编译/优化着色器。这可能会非常 明显,尤其是在移动平台上。
调用此函数将使用当前加载的所有着色器的所有变体执行虚拟 one-invisible-triangle 渲染。这可能需要一些时间,但有助于 避免未来出现暂时性中断。一般最好使用 ShaderVariantCollection 实现更精细的 着色器预热控制。
请注意,此函数仅预热当前加载(显式或通过对使用自定义着色器的预制件的引用)的着色器。
如果使用 Resources.Load 加载着色器,则需要再次调用 WarmupAllShaders。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值