优化变量类型
数据类型在定义的时候,应尽量根据自己的需求,分析之后选择一个既能满足开发需求,又能尽量降低由数据大小造成的性能问题。
shader中支持的数据类型:
- float:高精度浮点值,通常是32位,也是三者中最慢的一个。它对应的还有float2,float3和float4。
- half:中精度浮点值。通常是16位,范围是-60000至+60000,它适合存储UV坐标,颜色值等,比float类型快很多。它对应的还有half2,half3,和half4。
- fixed:低精度浮点值。通常是11位,范围是-2.0至+2.0,精度为1/256。这是三者中最小的一个,可以用于光照计算、颜色等。它对应的值有fixed2,fixed3和fixed4。
官网对类型的选择,给出了下面的建议:
- 尽可能使用低精度变量。
- 对于颜色值和单位长度的向量,使用fixed。
- 对于其他类型,如果范围和精度合适的话,使用half;其他情况使用float。
共享UV坐标
这步优化很简单,仅仅使用了Main Texture的UV坐标来代替法线贴图的UV坐标,这样实际上减少了内部提取法线贴图UV坐标的代码。这种方法可以很好地简化我们的代码。
减少处理的光源个数
这一步优化是通过在#pragma语句中声明noforwardadd值来实现的。这主要是告诉Unity,使用这种Shader的对象,只接受一个单一的平行光光源作为逐像素光源,其他的光源都使用内置的球谐函数处理后作为逐顶点的光源。当我们在场景中放置了另一个光源时,这种策略会很明显,因为我们的Shader使用一个法线贴图进行逐像素的操作。
这样做当然很好,但是如果我们需要不止一个平行光,而且想要控制哪一个是用于该逐像素计算的主光源,又该怎么办呢?这就需要Unity面板中的一个设置啦!如果你仔细观察,就会发现每一个光源都有一个Render Mode下拉菜单。当你点击它时,会出现Auto, Important, 和Not Important三种选项。通过选择Important,你可以告诉Unity这个光源更需要被当成一个逐像素光源,而非一个逐顶点光源。如果设置为Auto,那么就由Unity自己做决定啦!
让Shader只工作在特定的渲染器上
文章主要内容来源:
妈妈说女孩子要自立自强--【Unity Shaders】Mobile Shader Adjustment—— 什么是高效的Shader