5月份的时候参加了Unite北京的开发者大会,这里来分享一下,外面都可以查到的优化方法不包括在这篇文章里。PPt不是特别全,但是主要内容都有了,所以这边我就来说一下。
对了,顺便推广一波,我要开始准备开课了,我是主要讲特效实现和SF SG ASE那块,大家记得关注一波
给链接:https://connect.unity.com/g/5afaa37832b3060028b19178?tab=discussion (unity的社区,不用担心有毒)
这里主要说Vert frag shader 和surface shader的优化,不讲computeShader的内容。有关computerShader内容大家自行查unity官方的API。
首先说的是[Gamma][Linear]在不同空间时的区别
在Gamma颜色空间下,[Gamma][Linear]是没有区别的,所以指定无效
而在linear空间下,[Gamma][Linear]之间unity会做一个自动的转换。会将gamma标签进行一个计算,如果此时它的颜色是白色,那么转换后将为灰色一个非1的值。(这里我应该没记错是gamma吧,懒得开unity验证,有错大佬指出)。如果想节省部分开销可以标明空间减少转换的运算
就是下图
接下来需要说的是[NoScaleOffset]这个texture的标签
它的作用是用来隐藏贴图印射的缩放和偏移计算,代码依然可以操作
【凯爷的测试结果】
牙神告诉我的:你用图集的时候需要传输数据啊,spriterenderer帮你传了。不然你要控制tilling offset就合并不了了,只有自己写uv了,引擎底层的优化
[PerRendererDate]
Tags部分
DisableBatching 取消Batch,开启后将关闭自动合批。关闭合批就无法进行批处理,所以尽量不关闭。
ForceNoShadowCasting
true表示不受其它物体投掷阴影影响
false表示受别物体投掷阴影影响GrabPass 如果在不定义名字的情况下,将会自动定义,这部分操作也是额外的计算量,所以推荐直接定义好,如ppt第二部分那样。
Render State下面说的比较清楚,要注意的是,很多时候这个判断是无效的。得减少这种情况发生。
下面是说不建议使用Alpha testing ,不过这基本不现实,透明总是要用的。
surface shader 的优化,因为本人并不喜欢用它,一提它就想起去年优化布料系统效果的时候,都是泪,这部分大家自己看。
下面是重头戏,变体优化部分。
通常代码的写法,如下。
通常有2种写法,这里要科普下这两种的区别。
第一种
#pragma multi_compile __R #pragma multi_compile __G #pragma multi_compile __B
这种写法是消耗十分大的一种写法,它将生成所有组合类的变体,就是2*2*2种,这极大的增加了负担。
第二种
#pragma shader_featre __R #pragma shader_featre __G #pragma shader_featre __B
这种写法通常只生成自己,但是实际上容易不生成变体。需要进行处理,下面会说怎么处理。所以建议使用此类方法。
今天先打这么多吧,后面有缘再写。对了还要写后处理优化呢,我还欠着。
0000