Unity中Shader指令优化

这篇具有很好参考价值的文章主要介绍了Unity中Shader指令优化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

上一篇文章中,我们解析了Shader解析后的代码。我们在这篇文章中来看怎么实现Shader指令优化

  • Unity中Shader指令优化(编译后指令解析)

解析一下不同运算、条件、函数所需的指令数

1、常数基本运算

在DirectX平台,常数运算是不占指令数的。但是,稳妥起见我们最好自己计算好常数计算的结果。防止其他平台认为常数运算需要占指令。

  • Shader片元着色器中:

fixed4 frag (v2f i) : SV_Target
{
//常数基本计算
return 2 * 3;
}

  • 编译后只有一个赋值给输出结果的指令:

ps_4_0
dcl_output o0.xyzw
0: mov o0.xyzw, l(6.000000,6.000000,6.000000,6.000000)
1: ret

定义临时存储变量,也是不消耗指令数的,对性能没有影响

  • Shader片元着色器中:

fixed4 frag (v2f i) : SV_Target
{
//常数基本计算
fixed4 c = 0.2 * 3 / sin(4);
fixed4 c1 = c;
return c1;
}

  • 编译后同样只有一个赋值给输出结果的指令:

ps_4_0
dcl_output o0.xyzw
0: mov o0.xyzw, l(-0.792809,-0.792809,-0.792809,-0.792809)
1: ret

2、变量基本运算

变量的基本运算,是会使用GPU计算指令的。因为变量在计算前是未知的,会预留计算指令

  • Shader中:
  1. 属性面板定义一个四维向量

_Value(“Value”,Vector) = (0,0,0,0)

  1. 片元着色器中,使用该变量进行 加法 计算

fixed4 frag (v2f i) : SV_Target
{
//2、变量基本运算
float a = _Value.x;
float b = _Value.y;
float c = _Value.z;
float d = _Value.w;
float e = 1 + a;
return e;
}

  • 编译后(使用了加指令):

ps_4_0
dcl_constantbuffer CB0[3], immediateIndexed
dcl_output o0.xyzw
0: add o0.xyzw, cb0[2].xxxx, l(1.000000, 1.000000, 1.000000, 1.000000)
1: ret

  1. 变量进行减法运算

e = 1 - a;

  • 编译后(使用了加指令):

ps_4_0
dcl_constantbuffer CB0[3], immediateIndexed
dcl_output o0.xyzw
0: add o0.xyzw, -cb0[2].xxxx, l(1.000000, 1.000000, 1.000000, 1.000000)
1: ret

  1. 变量进行乘法运算(这里测试乘法,别使用 1 或 2,会自动转化为加法)

e = 3 * a

  • 编译后(使用了乘指令):

ps_4_0
dcl_constantbuffer CB0[3], immediateIndexed
dcl_output o0.xyzw
0: mul o0.xyzw, cb0[2].xxxx, l(3.000000, 3.000000, 3.000000, 3.000000)
1: ret

  1. 变量进行除法运算

e = 3 / a

  • 编译后(使用了除法指令):

ps_4_0
dcl_constantbuffer CB0[3], immediateIndexed
dcl_output o0.xyzw
0: div o0.xyzw, l(3.000000, 3.000000, 3.000000, 3.000000), cb0[2].xxxx
1: ret

  1. 变量进行多个相同运算

e = 3 * a * b;

  • 编译后:

ps_4_0
dcl_constantbuffer CB0[3], immediateIndexed
dcl_output o0.xyzw
dcl_temps 1
0: mul r0.x, cb0[2].x, cb0[2].y
1: mul o0.xyzw, r0.xxxx, l(3.000000, 3.000000, 3.000000, 3.000000)
2: ret

  1. 变量进行乘加运算,对性能优化特别重要(特殊)

e = 3 * a + b;

  • 编译后,会使用乘加指令(把乘法和加法合并成一个指令)

ps_4_0
dcl_constantbuffer CB0[3], immediateIndexed
dcl_output o0.xyzw
0: mad o0.xyzw, cb0[2].xxxx, l(3.000000, 3.000000, 3.000000, 3.000000), cb0[2].yyyy
1: ret

3、条件语句、循环 和 函数

  1. 条件语句

if(i.uv.x < 0.5)
{
i.uv.x = 1;
}
else
{
i.uv.x = 0;
}
return i.uv.x;

Unity中Shader指令优化,Unity,unity,游戏引擎

  • 编译后:

Unity中Shader指令优化,Unity,unity,游戏引擎
这里我们可以使用 step 函数来替代 该 条件语句
替代后,虽然编译结果一样的。但是,这是因为 条件语句 的程序体太简单
如果遇到比较复杂的 条件语句,我们可以使用 结合 step 和 算法的方法 把条件语句剔除

使用 step 函数后:

return step(0.5,i.uv.x);

  • 编译后
    Unity中Shader指令优化,Unity,unity,游戏引擎
  1. 循环语句

float e = 0;
for(int i = 0;i < 5;i++)
{
e += 0.1;
}
return e;

  • 编译后:

Unity中Shader指令优化,Unity,unity,游戏引擎

  1. mad指令优化:

优化前:

float e = (a + b) * (a - b);
return e;

  • 编译后:

Unity中Shader指令优化,Unity,unity,游戏引擎
优化后:

float e = a * a * (-b * b);
return e;

  • 编译后:

Unity中Shader指令优化,Unity,unity,游戏引擎

  1. 透过编译后的代码来直观的看出函数的内部执行(这里使用 normalize 来测试)

一维向量(常数):

float e = normalize(a);
return e;

  • 编译后:

Unity中Shader指令优化,Unity,unity,游戏引擎
多维向量归一化(编译后会使用点乘)

float e = normalize(_Value);
return e;

  • 编译后:

Unity中Shader指令优化,Unity,unity,游戏引擎

  1. abs(如果abs传入的是单一参数,就不会多用指令。但是传入式子,会多用指令)

传入式子:

float e = abs(a * b);
return e;

  • 编译后:

Unity中Shader指令优化,Unity,unity,游戏引擎
传入单一参数:

float e = abs(a) * abs(b);
return e;

  • 编译后:

Unity中Shader指令优化,Unity,unity,游戏引擎

  1. 负号可以适当的移到变量中

移动前:

float e = -dot(a,a);
return e;

  • 编译后:

Unity中Shader指令优化,Unity,unity,游戏引擎

移动后:

float e = dot(-a,a);
return e;

  • 编译后:

Unity中Shader指令优化,Unity,unity,游戏引擎

  1. 尽量把同一维度的向量进行结合运算

结合前:

float3 e = _Value.xyz * a * b * _Value.yzw * c * d;
return fixed4(e,1);

  • 编译后:

Unity中Shader指令优化,Unity,unity,游戏引擎

结合后:

float3 e = (_Value.xyz * _Value.yzw) * (a * b * c * d);
return fixed4(e,1);

  • 编译后:

Unity中Shader指令优化,Unity,unity,游戏引擎

  1. asin / atan / acos开销很大,尽量不要使用 (这里使用asin测试)

float e = asin(a);
return e;文章来源地址https://www.toymoban.com/news/detail-774726.html

  • 编译后
    Unity中Shader指令优化,Unity,unity,游戏引擎

到了这里,关于Unity中Shader指令优化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity中Shader变体优化

    在Shader中,一般有两个方面的优化:一方面是内存优化(即变体优化);一方面是渲染优化(即Shader中计算的优化)。我们这篇文章来了解一下Shader变体的优化。 创建一个UnlitShader,里面有一个默认的Shader #pragma multi_compile_fog 选择Shader后,点击Compile and show code 右边的小箭头可

    2024年02月04日
    浏览(28)
  • Unity Shader - UI/Default shader 优化示例

    Unity : 2020.3.37f1 Pipeline : BRP 做性能优化都是慢慢都扣出来的 当然,优先处理 top 热点的 但是一些就算不是 top,但是像素面积有多,overdraw 也多不可小觑 当然,如果你能找到性能热点,那还是优先分析一下哪些 shader 占的 cycles 最高,和 A, L/S, T, 最高 还有 register 的数量尽可能

    2024年02月07日
    浏览(30)
  • Unity中Shader抓取屏幕并实现扭曲效果(优化)

    对上一篇中实现的shader进行优化 1、定义结构体用于传入顶点坐标系 struct appdata { float4 vertex : POSITION; //从应用程序阶段的输入,多加一个uv,用于对扭曲纹理的采样 float2 uv : TEXCOORD; }; 2、因为UnityObjectToClipPos是从本地空间转换到裁剪空间,但是没有进行透视除法,所以需要对其

    2024年02月03日
    浏览(39)
  • Unity中的渲染优化技术 -- Shader入门精要学习(15)

    本章中,我们将阐述一些 Unity 中常见的优化技术。这些优化技术都是和渲染相关的,例如,使用批处理、LOD 技术等。 游戏优化不仅是程序员的工作,更需要美工人员在游戏的美术上进行一定的权衡。例如,避免使用全屏的屏幕特效,避免使用计算复杂的 Shader,减少透明混合

    2024年01月18日
    浏览(30)
  • Unity 性能优化Shader分析处理函数:ShaderUtil.GetShaderGlobalKeywords用法

    点击封面跳转下载页面 在Unity开发中,性能优化是一个非常重要的方面。一个常见的性能优化技巧是使用ShaderUtil.GetShaderGlobalKeywords函数来获取着色器的全局。本文将介绍如何正确使用该函数,并提供一个实例代码来演示其用法。 ShaderUtil.GetShaderGlobalKeywords是Unity引擎中

    2024年02月09日
    浏览(31)
  • 十八、Unity游戏引擎入门

    1、下载     首先需要下载Unity Hub,下载网址:https://unity.com/cn。     然后在其中下载Unity编辑器并安装,可选择最新版本。     接着需要选择适合的开发环境,例如Android Studio或Xcode,以便进行手机游戏开发。在安装完Unity后,需要根据项目需求下载对应的模块和插件,例

    2024年02月16日
    浏览(51)
  • 【游戏开发小技】Unity通过UI全屏图来模糊场景画面(Shader | 模糊 | 滤镜 | Blur)

    一、前言 嗨,大家好,我是新发。 以前我写文章都是很长很长,接下来我会尝试用新的方式来写博客,尽量简短,以实用为主。同时也是作为自己零碎的一些记录,方便查阅。 本文我要说的是在 Unity 中通过 UI 全屏图来模糊场景画面的效果。 二、效果演示 这是没用模糊效果

    2024年02月05日
    浏览(32)
  • Unity 性能优化之Shader分析处理函数ShaderUtil.HasProceduralInstancing: 深入解析与实用案例

    点击封面跳转到Unity国际版下载页面 在Unity中,性能优化是游戏开发过程中非常重要的一环。其中,Shader的优化对于游戏的性能提升起着至关重要的作用。本文将深入解析Unity中的Shader处理函数 ShaderUtil.HasProceduralInstancing ,并提供一些实用案例来展示其用法。 ShaderUtil.HasProce

    2024年02月09日
    浏览(31)
  • 使用团结引擎开发Unity 3D射击游戏

           本案例是初级案例,意在引导想使用unity的初级开发者能较快的入门,体验unity开发的方便性和简易性能。       本次我们将使用团结引擎进行开发,帮助想体验团结引擎的入门开发者进行较快的环境熟悉。      本游戏是一个俯视角度的射击游戏。主角始终位于屏幕

    2024年01月19日
    浏览(52)
  • Unity、UE、Cocos游戏开发引擎的区别

    Unity、Unreal Engine(UE)和Cocos引擎是三个常用的游戏开发引擎,它们在功能和特性上有一些区别。以下是它们之间的主要区别: 编程语言:Unity使用C#作为主要的编程语言,开发者可以使用C#脚本进行游戏逻辑编写。Unreal Engine主要使用C++作为编程语言,但也支持蓝图系统,允许

    2024年02月22日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包