Shader Coding 之 特效越跑越慢
严正声明:
作者:www.cnblogs.com/psklf/ https://www.cnblogs.com/psklf/p/17508876.html
欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任!
作者:www.cnblogs.com/psklf/ https://www.cnblogs.com/psklf/p/17508876.html
欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任!
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
之间循环,避免出现较大的浮点数。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通