作为一名技术美术,Shader的性能优化是基本功。
简单的一些,在不影响效果输出的情况下减少变量的精度,避免数据类型的转换。
减少或避免使用幂函数、指数函数、三角函数等复杂的函数运算,使用近似方程。
或者将一些计算写入纹理,使用纹理读取的方式减轻运算量。
这些Tips在工作中可以说都没有什么顾虑去实现。
但是我个人的顾虑是:在Shader编写中,我们可以知道有些计算,是可以放到三个部分中的,比如顶点着色器,片段着色器以及脚本中。顶点着色器和片段着色器,分别是逐顶点和逐像素来进行计算的。而脚本中,是每一帧计算的(Update函数)。
Note:这里指的运算是每一帧针对物体的所有像素的计算结果只有一个固定值的通用计算。
那把计算放到哪里更能优化性能?
顶点着色器:逐顶点计算,计算次数等于顶点数。
片段着色器:逐像素计算,计算次数等于像素数。
脚本:逐帧计算,每帧计算一次。
Note:不考虑模型裁剪和剔除。
从计算次数上来看效率,脚本>顶点着色器>片段着色器。
然而区别是,顶点着色器和片段着色器是Shader内部的计算,运行在GPU上。在非固定的渲染管线下,将计算从片段着色器移动至顶点着色器使得性能得到优化是没有疑问的。而脚本的计算则是运行在CPU上,计算得到的结果传递给GPU也会有性能的开销。这样使用脚本来替代顶点着色器中的计算是否真的能优化性能?
举两个极端的例子:
模型1:超高精度模型,模型顶点数1000W。(Nvidia的技术展示Demo)
模型2:Quad,模型顶点数4。
如果对于模型1,还能肯定的说,脚本效率更高。那么对于模型2,还能这么肯定么?
GPU和CPU的浮点运算性能差距,以及CPU向GPU传值的性能开销,要如何衡量?
相关文章
- 解读Unity中的CG编写Shader系列十 (光滑的镜面反射(冯氏着色))
- 【ZZ】C 语言中的指针和内存泄漏 & 编写高效的C程序与C代码优化
- Google的工程师质量文化(code-review)(思考)-第二步: 定义期望的做事方法 开发团队编写自动化测试。 主动运行自动化测试用例。 做代码评审。 第三步: 提供相应的培训在公司范围内组织代码设计与自动化测试培训。(思考二:以前端代码为例 eslint 的规范是由培训者定义还是由团队成员老决定?) 为每个团队指派自动化测试教练,帮助团队提高自动化测试技能。 第四步: 做些必需的事情来强化那些行为建立团队测试认证机制(test certified mechanism),共分3个大级别,12个子级,用于评估每个软件产品团队的测试成熟度。 通过每个季度统计各级别上的团队数量分布,来评估自动化测试文化在公司内部的进展程度。 建立自动化测试组(test group)和测试教练组(test mentor),帮助团队提升自动化测试能力。 建立代码评审资质证书。(思考三:评审资质需要怎样的考核?) 代码合入版本仓库之前强制做代码评审。 代码评审之前,必须运行自动化测试用例,并提交报告给代码评审者。(思考四:评审者来code自动化测试吗脚本?)
- JavaScript工作机制:V8 引擎内部机制及如何编写优化代码的5个诀窍
- JavaScript是如何工作的02:深入V8引擎&编写优化代码的5个技巧
- PHP代码编写的优化
- 解读Unity中的CG编写Shader系列五(理论知识)
- 编写高效的Java代码:常用的优化技巧【四】之并发编程技巧
- 编写高效的Java代码:常用的优化技巧【二】
- 编写高效的Java代码:常用的优化技巧【一】