https://mp.weixin.qq.com/s/Vyn1bKaBMHommxbnFPPQeg

Unity对Shader文件进行编译的时候,DX9和DX11的版本会直接生成汇编码。

?

 
length(i.worldPos)

DX9

DX11

由于这些代码是最终的指令,大部分指令执行时间是“差不多”的,可以用来预估计算量。但移动平台则是各厂商驱动各自进行的编译,各家都不一样,不好判断。

但DX9毕竟针对的是非常古老的硬件,很难想象现代GPU还会和它保持一样。实际的指令应该会更接近于DX11。

以下为列表(用|隔开的数据,前面的部分是计算单分量时的指令数,后面的部分是计算float4时的指令数)

总结一下便是:

  • 反三角函数非常费

  • abs和saturate是免费的

  • 除了反三角函数外,fmod和smoothstep比预期更费

  • log,exp,sqrt(单分量)的成本实际上很低,所以由他们组合成的pow也不高

  • sin,cos在DX11使用了专门一条单指令,成为了低成本函数

另外还有个基本常识:绝大部分GPU是一次性计算4个分量,计算一个float4和只计算单个float耗时是一样的。当计算float时,剩下三个分量的时长会被浪费。

然而,每条指令的时间成本确实可能是不一样的。这个和具体硬件有关。

很难找到移动平台具体GPU的数据,可以参考下文看看一些主流GPU的情况,相信他们总是有一些共性的。

结果是,1/x, sin(x), cos(x), log2(x), exp2(x), 1/sqrt(x)这些指令的时间成本是一样的,而且和普通的四则运算很接近(个人猜测是通过查表实现的)。

但是sin,cos毕竟在旧硬件上成本较高,由于不清楚硬件的具体情况,还是要尽可能少用。


预估成本还有一个办法,是根据公开的GPU的GFLOPS(Floating-point Operations Per Second每秒执行浮点运算次数)来评估每个着色器理论极限算力,便能知道一个着色器里可以允许多少条基本指令。

这当然很不精确,因为纹理采样,顶点,光栅化等等众多成本都没有考虑在内,但是有一定的参考价值。

iPhone 4s使用的芯片是Apple A5,它的FLOPS是12.8G,屏幕分辨率是960x640,分到一帧的一个像素后,结果是

12.8*1024^3/960/640/60 = 372。

根据FLOPS的定义,时间最短的基本指令“乘加(MAD)”需要花掉2FLOPS,那么单个屏幕像素能执行186条指令。

假设Overdraw是5,那么一个像素着色器能执行37指令。

虽然37指令这个结果显然比实际多多了,但起码是在合适的数量级范围内。可以通过帧率测试来计算“损耗比例”到底是多少。

而且,这样做我们其实得到了一个上限值。如果你在像素单元的指令数超过了37(比如用了两次atan2),那从物理角度是绝对不可能达到满帧的。

知乎@flashyiyi

[内容分享]粗略判断Shader每条代码的成本的更多相关文章

  1. Android 应用程序之间内容分享详解(一)

    一个Andoird应用程序的重要的地方是他们有相互沟通和整合的能力,一个应用程序可以和另一个应用程序交互,接下来我们来看看Android应用之间的内容分享 当你构建Intent的时候,必须要指定Int ...

  2. ABP架构设计交流群-上海线下交流会的内容分享(有高清录像视频的链接)

    点这里进入ABP系列文章总目录 ABP架构设计交流群-7月18日上海线下交流会内容分享 因为最近工作特别忙,很久没有更新博客了,真对不起关注我博客和ABP系列文章的朋友! 原计划在7月11日举行的AB ...

  3. 基于jQuery滑动分步式进度导航条代码

    分享一款基于jQuery滑动分步式进度导航条代码.这是一款基于jquery实现的网站注册动态步骤导航条代码.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div id=& ...

  4. Phpcms v9 实现首页|列表页|内容页调用点击量的代码

    很多朋友经常问Phpcms v9的首页.列表页.内容页点击量如何调用.今天给大家分享phpcms V9如何分别在首页.列表页.内容页调用点击量代码 1,Phpcms v9首页调用点击量 {pc:con ...

  5. Ajax (Asynchronous javascript xml) 搜索框核心代码(JQuery) Ajax判断用户名存在核心代码 附:原生js的Ajax代码 其中有json的一句话解释

    前端 <script type="text/javascript"> $(function(){ $("#tid").keyup(function( ...

  6. iOS的应用程序实现之间的内容分享

    前言 我们在iOS的平台上想要实现不同应用之间的内容分享一般有几种常用方式: 一种第的英文通过AirDrop实现不同设备的应用之间文档和数据的分享; 第二种是给每个应用程序定义一个URL方案,通过访问 ...

  7. 如何去把内容分享到whatsapp上?

    使用场景,公司利用whatsapp来推广商品,需要把商品和一些基本信息分享到WhatsApp上; 一:在html的head标签里面通过meta标签加上一些分享的基本网站信息,具体代码如下 <me ...

  8. 【转】css布局居中和CSS内容居中区别和对应DIV CSS代码

    原文地址:http://www.divcss5.com/jiqiao/j771.shtml css布局居中和CSS内容居中区别和对应DIV CSS代码教程与图文代码案例篇 对于新手来说DIV CSS布 ...

  9. RunJS - 在线编辑、展示、分享、交流你的 JavaScript 代码

    发现一个很好玩,很强大的网站 RunJS - 在线编辑.展示.分享.交流你的 JavaScript 代码   http://runjs.cn/ 比如: http://runjs.cn/detail/l ...

随机推荐

  1. 蓝桥杯 历届试题 PREV-32 分糖果

    历届试题 分糖果   时间限制:1.0s   内存限制:256.0MB 问题描述 有n个小朋友围坐成一圈.老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏: 每个小朋友都把自己的糖果分一半给左手边 ...

  2. PCIe相关的操作命令

    1.lspci        --显示列举系统目前的pcie设备    43:00.0 Class 0004: Device 104c:b800 (rev 01)    //netra设备 设备编号 ...

  3. MySQL 学习五 SQL实用函数

    0 select now() 显示当前时间. 1 select char_length('andyqan')   显示字符长度. 2 日期格式化         select date_format( ...

  4. UTF-8, Unicode, GB2312格式串转换之C语言版

    原住址:http://www.cnitblog.com/wujian-IT/archive/2007/12/13/37671.html           /*      author:   wu.j ...

  5. 问题:oracle 排序 null值放在最后;结果: ORACLE中null的排序问题

    ORACLE中null的排序问题 关键字: oracle nulls 问题描述:    在平时的业务处理中,经常遇到要对业务数据进行排序,并且要对null值也做相应的排序.在Oracle中,进行Ord ...

  6. xcode 编译报错“Cannot create __weak reference in file using manual reference counting”解决办法<转>

    http://blog.csdn.net/ouq68/article/details/51003876 解决方法: Please set ‘Weak References in Manual Reta ...

  7. 【MySQL】20个经典面试题(转)

    原文链接:http://bbs.51cto.com/thread-1470880-1.html Part2:经典题目 1.MySQL的复制原理以及流程 基本原理流程,3个线程以及之间的关联: 2.my ...

  8. LaTex: 表格单元格内容 分行显示/换行

    问题:如何同时让表格同一行一个单元格的文字能垂直居中?比如说文字超长超出页面范围需要分行显示 答:(来源于smth) 方案一: \newcommand{\tabincell}[2]{\begin{ta ...

  9. 关于uboot的一些优化

    转载于:http://blog.163.com/solylee@126/blog/static/1718231572010101910485331/ 本人的开发环境是u-boot-1.1.6版本,fe ...

  10. adb eclipse 截屏

    DDMS  左侧  选中设备 右上角有一个相机样式的按钮"screen capture"