游戏蛮牛学习群(纯技术交流,不闲聊):539178957
游戏蛮牛 手机端
开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

问答求助

关注:547

当前位置:游戏蛮牛 技术专区 问答求助

_____________________________________________________________________________________________________________
问答求助版块规则:

  1、问题尽量描述清楚
      2、代码要放在代码块里
      3、附件最好放到云盘,然后把链接放到TXT文档里,上传TXT文档。【最好没有附件,你懂得】
      4、本版块回复不得无意义,如:顶、呵呵、不错......以及擦边!【真的会扣分的哦】严重者,封IP!
      5、问题得到解决,请选择最佳答案。
      6、若问题是你自己解决了,可以联系管理员,返还蛮牛币,写下你的答案,另有蛮牛币奖赏。
_____________________________________________________________________________________________________________
查看: 281|回复: 9

[基本操作] SetPass Call 为什么会小于 Batches?

[复制链接]  [移动端链接]
7日久生情
1585/5000
排名
1169
昨日变化

5

主题

121

帖子

1585

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
82205
好友
0
蛮牛币
3812
威望
0
注册时间
2015-3-20
在线时间
540 小时
最后登录
2018-8-10
发表于 2018-5-14 17:01:23 | 显示全部楼层 |阅读模式
100蛮牛币
观察Stats面板经常发现 setpass calls 数量 小于 batches数量, 感觉很不合理 info.png

batches数量,就是 批处理优化过后的 drawcall数量  ,  也就是一次 cpu 向 gpu 输送图元信息 就会产生一个 batches,  也就是进入一个shader只会增加一次drawcall

setpass calls,  就是 shader里面 subshader里pass通道进入的次数,那么进入一个shader 可能会有多个pass通道会被执行

那么显然setpass calls 的数量只会大于等于 batches的数量啊,为什么会出现 setpass calls 小于 batches的数量呢??  是不是我哪里理解有问题, 求教




回复

使用道具 举报

排名
19320
昨日变化
9

0

主题

24

帖子

68

积分

Rank: 2Rank: 2

UID
45582
好友
0
蛮牛币
138
威望
0
注册时间
2014-9-18
在线时间
20 小时
最后登录
2018-7-2
QQ
发表于 2018-5-14 17:01:24 | 显示全部楼层
DKC 发表于 2018-5-16 14:23
感谢指导,这些确实都是我不知道的东西
也就是说set pass call 只会在一个pass第一次被用到的时候才会+1 , ...

首先set pass cal 并不是一个pass第一次用到的时候+1啊,是切换的时候+1。假如 你交替加入 100个互相遮挡得两种物体 ,那set pass cal 不是2   而是100

这个统计得不是pass 得使用次数,而是切换次数 其实也是pass 提交到gpu 的次数,
//写到这发现我有点误导你了!!!!

其实这里的pass 和 shader 里的pass 是两个概念的,被我拿shader 的pass 代表了。

这里的 pass 其实是RenderPassData。 这是unity 底层包装的一组数据,包括材质,贴图  passflag (这个才是shader 的pass) 等多个数据,这里面的数据只要有一个不同,就会产生一个新的 set pass call ,你可以试试 同样的shader ,不同贴图,或者不同材质的相同模型,同样会产生新的pass call 的。

这个set pass call,实际上表示的意义 大致上相当于 cpu 向gpu 提交了一次 除了顶点数据之外的其他渲染资源(一个render pass)这个一般情况下还是比较耗的,然后接下来才会提交一个或者多个drawcall (这个一般其实没那么费)。所以拿这个当性能指标没什么问题。






drawcall 作为性能指标现在看来是不那么准的,你可以看profile 里的batched drawcall ,那个相对准一些。





回复

使用道具 举报

排名
19320
昨日变化
9

0

主题

24

帖子

68

积分

Rank: 2Rank: 2

UID
45582
好友
0
蛮牛币
138
威望
0
注册时间
2014-9-18
在线时间
20 小时
最后登录
2018-7-2
QQ
发表于 2018-5-15 19:23:29 | 显示全部楼层
这是因为 有两个或者更多使用了同样shader 的 mesh 没有被batch 啊。
你 弄个简单的场景,加入多个一样的复杂模型就看出来了。

shader 只提交一次,但是顶点要提交多次啊,因为模型并不符合动态batch 的条件啊。

说的更那啥点,就是useprogram 只调用了一次 bindbuff 调用了多次。
[发帖际遇]: 一个袋子砸在了 lookahead99 头上,lookahead99 赚了 1 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

7日久生情
1585/5000
排名
1169
昨日变化

5

主题

121

帖子

1585

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
82205
好友
0
蛮牛币
3812
威望
0
注册时间
2015-3-20
在线时间
540 小时
最后登录
2018-8-10
 楼主| 发表于 2018-5-16 12:09:53 | 显示全部楼层
lookahead99 发表于 2018-5-15 19:23
这是因为 有两个或者更多使用了同样shader 的 mesh 没有被batch 啊。
你 弄个简单的场景,加入多个一样的复 ...

你好, 你的回答对我很有帮助,不过我还是有一点疑惑
"shader 只提交一次,但是顶点要提交多次啊"  这句话该怎么理解呢?
按照我目前的认识是: 每次顶点提交到gpu里之后很定会进入shader里写好的pass通道吧, 那么显然setpasscall依然会增加.  所以 "顶点提交多次" 对应的应该是 "setpass call 和 batch 都会增加多次"
是不是我的理解有问题呢

回复

使用道具 举报

排名
19320
昨日变化
9

0

主题

24

帖子

68

积分

Rank: 2Rank: 2

UID
45582
好友
0
蛮牛币
138
威望
0
注册时间
2014-9-18
在线时间
20 小时
最后登录
2018-7-2
QQ
发表于 2018-5-16 12:43:19 | 显示全部楼层
本帖最后由 lookahead99 于 2018-5-16 12:44 编辑
DKC 发表于 2018-5-16 12:09
你好, 你的回答对我很有帮助,不过我还是有一点疑惑
"shader 只提交一次,但是顶点要提交多次啊"  这句话 ...

其实pass 呢, 是unity 的概念,不是dx 或者opengl 的概念啊,底层是没有setpass 这个东西的,unity 会把每个pass 编译成一个program 而每一次的useprogram 会被统计成一次set pass call ,所以当你的模型都一样的时候只有第一个drawcall 提交了program 剩下的drawcall 不需要提交program 了,仅仅是调用drawelement 或者 drawarray 就行了。

回复

使用道具 举报

7日久生情
1585/5000
排名
1169
昨日变化

5

主题

121

帖子

1585

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
82205
好友
0
蛮牛币
3812
威望
0
注册时间
2015-3-20
在线时间
540 小时
最后登录
2018-8-10
 楼主| 发表于 2018-5-16 14:23:03 | 显示全部楼层
lookahead99 发表于 2018-5-16 12:43
其实pass 呢, 是unity 的概念,不是dx 或者opengl 的概念啊,底层是没有setpass 这个东西的,unity 会把 ...

感谢指导,这些确实都是我不知道的东西
也就是说set pass call 只会在一个pass第一次被用到的时候才会+1 ,可以认为setpasscall统计的是每一帧使用到的pass种类数对吧
那如果是这样的话,感觉setpasscall并不像drawcall 一样能够直接反映每一帧的渲染压力是多少吧, setpasscall数少也有可能drawcall次数很多,渲染压力依然可能很大.   这样的话 unity5为什么会用 setpasscall 来作为一个新的衡量性能指标的参数呢

回复

使用道具 举报

排名
19320
昨日变化
9

0

主题

24

帖子

68

积分

Rank: 2Rank: 2

UID
45582
好友
0
蛮牛币
138
威望
0
注册时间
2014-9-18
在线时间
20 小时
最后登录
2018-7-2
QQ
发表于 2018-5-16 17:16:51 | 显示全部楼层
DKC 发表于 2018-5-16 14:23
感谢指导,这些确实都是我不知道的东西
也就是说set pass call 只会在一个pass第一次被用到的时候才会+1 , ...

首先set pass cal 并不是一个pass第一次用到的时候+1啊,是切换的时候+1。假如 你交替加入 100个互相遮挡得两种物体 ,那set pass cal 不是2   而是100

这个统计得不是pass 得使用次数,而是切换次数 其实也是pass 提交到gpu 的次数,
!!!!!写到这发现我有点误导你了!!!!

其实这里的pass 和 shader 里的pass 是两个概念的,被我拿shader 的pass 代表了。

这里的 pass 其实是RenderPassData。 这是unity 底层包装的一组数据,包括材质,贴图  passflag (这个才是shader 的pass) 等多个数据,这里面的数据只要有一个不同,就会产生一个新的 set pass call ,你可以试试 同样的shader ,不同贴图,或者不同材质的相同模型,同样会产生新的pass call 的。

这个set pass call,实际上表示的意义 大致上相当于 cpu 向gpu 提交了一次 除了顶点数据之外的其他渲染资源(一个render pass)这个一般情况下还是比较耗的,然后接下来才会提交一个或者多个drawcall (这个一般其实没那么费)。所以拿这个当性能指标没什么问题。






drawcall 作为性能指标现在看来是不那么准的,你可以看profile 里的batched drawcall ,那个相对准一些。





回复

使用道具 举报

7日久生情
1585/5000
排名
1169
昨日变化

5

主题

121

帖子

1585

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
82205
好友
0
蛮牛币
3812
威望
0
注册时间
2015-3-20
在线时间
540 小时
最后登录
2018-8-10
 楼主| 发表于 2018-5-16 17:32:59 | 显示全部楼层
lookahead99 发表于 2018-5-16 17:16
首先set pass cal 并不是一个pass第一次用到的时候+1啊,是切换的时候+1。假如 你交替加入 100个互相遮挡 ...

讲的可以说是非常详细明白了
这些东西理解的这么透彻的人绝对称得上是大牛了,非常感谢~

回复

使用道具 举报

5熟悉之中
707/1000
排名
3650
昨日变化
9

1

主题

122

帖子

707

积分

Rank: 5Rank: 5

UID
236305
好友
1
蛮牛币
1015
威望
0
注册时间
2017-8-7
在线时间
212 小时
最后登录
2018-8-17
发表于 2018-5-17 11:11:27 | 显示全部楼层
看的云里雾里 收藏一下 以后说不定就悟了

回复

使用道具 举报

排名
918
昨日变化
3

16

主题

1104

帖子

3031

积分

Rank: 9Rank: 9Rank: 9

UID
68430
好友
12
蛮牛币
10818
威望
0
注册时间
2015-1-14
在线时间
807 小时
最后登录
2018-8-17
发表于 2018-5-18 10:35:54 | 显示全部楼层
果断看不懂~~嘎嘎···

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表