当前位置: 首页 >  网站大师 >  Shader Coding 之 特效越跑越慢

Shader Coding 之 特效越跑越慢

导读:Shader 特效越跑越慢问题的排查.问题.某屏幕特效 shader 逻辑是呈现自上而下或自左而右的扫描线效果,其核心.逻辑大致如下.float t = fract(time/3.6);.t = (t-0.5)*4.0-1.0;.t = abs(x-t);.t = 1.0-smo

Shader 特效越跑越慢问题的排查

问题

某屏幕特效 shader 逻辑是呈现自上而下或自左而右的扫描线效果,其核心
逻辑大致如下

float t = fract(time/3.6);
t = (t-0.5)*4.0-1.0;
t = abs(x-t);
t = 1.0-smoothstep(0.005,0.008,t) + (1.0-smoothstep(0.002,0.04,t))*0.4;

out_color.rgb = vec3(0.8, 0.6, 0.8);
out_color.a = t;

问题现象为:在运行一段时间后,出现卡顿表现,原本连续运动的扫描线
呈现出一种间断性步进的效果,而非平滑地移动。

分析与解决

面对此问题,首先需要确认是否是渲染帧率下降,经简单的代码内 Fps 计
算得整体 Fps 保持在 60 无误。使用相关的帧率监控 profiler 也能得到
一致的结果。为确认帧率,使用 System trace 工具抓帧查看,确认每帧
绘制时间并无 delay, 整体渲染并无问题。

排除帧率因素,那么渲染卡顿原因可能来自逻辑错误,而非性能不足,即
计算出现误差而呈现出卡顿或间断性移动的现象。由于在 shader 内对平
移的计算主要使用 time 时间这个数值来计算,而这个数值在 CPU 端一直
累加,数值持续变大,有理由怀疑该浮点数值足够大时会产生误差。

根据对代码分析和试验,最终找到误差的来源是下面这一行代码

float t = fract(time/3.6);

当 time 较大,除以 3.6 再取小数,会带来较大的误差。这里误差的来源
必须是除法和取小数共存,若直接取小数 fract(time) 则其并无较大误差。

针对这个问题,目前的解决方法是 time 的更新以 90 秒为一个循环,在 0-90
之间循环,避免出现较大的浮点数。

内容
  • 三维模型轻量化在移动应用场景的如何发挥作用
    三维模型轻量化在移动应用场景的如
    2023-12-01
    在移动应用场景中,三维模型的重量对于应用的性能、流畅度和用户体验都有很大的影响。而三维模型轻量化技术可以通过减少模型数据
  • 旋转网格超采样(Rotated Grid Supersampling)
    旋转网格超采样(Rotated
    2023-12-06
    旋转网格超采样(Rotated Grid Supersampling).这是对文章 4-Rook Antialiasin
  • gitlab ci 集成 eslint/prettier/tsc 做代码审查,并使用 eslint 输出作为显示代码质量
    gitlab ci 集成 esl
    2023-12-09
    前言.想自动化一下公司里代码的部分审查,最初想用 reviewdog 的,但是公司的域名基本都在 VPN 中访问的,gi
  • 什么是软件供应链?
    什么是软件供应链?
    2023-12-05
    1 软件供应链定义.需方和供方基于供应关系,开展并完成软件采购、开发、交付、获取、运维和废止等供应活动而形成的网链结构。
  • 在idea/webstorm等terminal运行命令报错:Command rejected by the operating system没有权限【已解决】
    在idea/webstorm等t
    2023-12-10
    在idea/webstorm等编译器terminal窗口运行命令报错:Command rejected by the o
  • 实时光线追踪(3)Ray Casting
    实时光线追踪(3)Ray Cas
    2023-12-01
    目录.硬件光追(Hardware Ray Tracing).加速结构(Acceleration Structure,AS