找回密码
 注册帐号

扫一扫,访问微社区

外文翻译 Render- Animation Instancing

28
回复
2976
查看
[ 复制链接 ]
排名
1
昨日变化

8061

主题

8619

帖子

3万

积分

Rank: 16

UID
1231
好友
186
蛮牛币
12260
威望
30
注册时间
2013-7-29
在线时间
4127 小时
最后登录
2019-8-23

活力之星原创精华达人突出贡献奖财富之证游戏蛮牛QQ群会员蛮牛妹VIP

2018-12-10 11:23:29 显示全部楼层 阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
我们经常会通过使用GPU Instancing 来对一些户外的场景(如花草、树木)进行批量优化处理。但是对于游戏中的角色(绑有 SkinnedMeshRenderer 组件的对象),我们无法通过GPU Instancing 来优化,原因是大量的 skinning(蒙皮)计算发生在 CPU 中,然后相关顶点数据流逐个地被提交到 GPU 再进行渲染计算。一般情况下,CPU是无法一口气把所有的角色数据提交到渲染管线。当一个场景中有大量挂有SkinnedMeshRenderer的对象时,将会产生大量的Draw Call(简称DC) 和动画的计算。


原文的作者提供了一种方法来减少CPU环节的开销,这种技术称之为 “ Instancing”,通过对GPU Instancing的特性进行扩充。但是,这个解决方案还处于试验阶段。如果使用中有问题,欢迎猛戳 这里


目前来说,Animation Instancing 支持的特性包括:Root Motion, Attachment, Animation Events,暂不支持:Transitions(动画过渡),Animation Layer(动画层级)。此外,目前移动平台只支持 OpenGL ES3.0及更新的版本。




接下来,我们来看一下如何使用?


Animation Generation
在我们对角色进行 Instancing 之前,我们需要将角色的动画信息制作成纹理,这种纹理我们叫做Animation Texture(动画纹理),是GPU用来进行蒙皮所使用的纹理。
1.jpg

Animation Instancing 的 Generator窗口工具
这个生成器还支持从指定的GameObject对象所挂载的动画组件上收集动画数据以及动画事件。
当我们完成生成动画纹理后,Animation Instancing脚本会在运行时加载动画纹理。需要注意的是,这里的动画数据并不是animation clip动画片段。


Instancing
Animation Instancing脚本使用起来很方便,只需要将它挂在我们场景中要处理的对象上。其中Bone Per Vertex 这个参数用来控制每一个顶点缓存对应需要计算的骨骼数。这个参数越小,GPU的性能表现就越好,但是渲染出来的精度就越低。


2.jpg

Animation Instancing脚本



接下来,我们需要修改shader来使得它支持我们的Animation Instancing。其实,你只需要把下面两行代码加到你的shader中就可以。它不会影响你的shader工作,只是增加一个用来蒙皮的顶点着色器。


#include    “AnimationInstancingBase.cginc”   #pragma vertex vert


性能分析
我们可以通过unity提供的动画案例来进行测试,资源下载地址请见“Animation Instancing 工程源码”。
接下来,我们将它放到iphone6设备机上进行测试,并且看一下profiler视图上的对比数据


  • CPU

一开始,我们在场景中放300个角色,而我们的FPS只有15帧。如果需要达到至少30帧的话,我们需要减少我们的角色数量到150。但是使用了Animation Instancing以后,我们在场景中放了900个角色,可以看到,帧数依然稳定在30帧。
3.jpg
未使用Instancing的效果

4.jpg

正如你所看到的,由于CPU的计算量导致了帧数下降。


5.jpg
使用了Animation Instancing的效果

6.jpg



使用了Animation Instancing以后,我们减少了动画部分的计算量(骨骼与蒙皮),这减轻了CPU大部分的开销,这样我们可以使用比原来多5、6倍的角色。
在刚才的测试场景中,周围场景的渲染大概在80个DC左右,每个角色由3个材质,也就意味着渲染一个角色至少要3个DC。


如果不使用Animation Instancing,我们放置250个角色,那么需要花费1100个左右的DC(3*250 角色 + 他们的阴影)。
当使用了Animation Instancing以后,即使放置800个角色,DC只有50个左右。因为,4800多个DC被合批到了48个batch(3*8 角色 + 3*8 阴影)中发送给GPU。基本上每1个batch包含了100个角色的渲染信息。


7.jpg
8.jpg
FrameDebugger信息对比
  • GPU

这种技术稍微提高了GPU的开销,因为我们把蒙皮的处理放到了GPU环节。如果角色有阴影,我们就会在shadow pass中对角色再次进行蒙皮计算。这是一种权衡行为,由于这种情况,因为减少了CPU的开销而提高了帧率,收益大于损耗。



  • 内存

这种技术会占用一些额外的内存来存储 Animation Texture 动画纹理。这种纹理将蒙皮使用的数据以矩阵形式存储。纹理格式 我们使用 RGBAHalf。设想一下,如果一个角色有N根骨骼,每个骨骼占4个像素(一个矩阵);如果我们生成的动画有M关键帧,那么一个动画将花费N*4*M*2 = 8NM字节空间。如果一个角色有50根骨骼,生成的动画占30帧关键帧,一个动画将占用6000个像素(50*4*30),那么一张1024*1024的纹理可以存储174个动画数据。

重要的事情说三编,工程源码:


回复

使用道具 举报

7日久生情
2385/5000
排名
1387
昨日变化

0

主题

742

帖子

2385

积分

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

UID
135463
好友
0
蛮牛币
87
威望
0
注册时间
2016-1-23
在线时间
751 小时
最后登录
2019-8-24
2018-12-10 12:46:33 显示全部楼层
jlkhjbkljhbkjhbkjhkjhk
回复 支持 反对

使用道具 举报

5熟悉之中
718/1000
排名
6935
昨日变化

0

主题

441

帖子

718

积分

Rank: 5Rank: 5

UID
7335
好友
1
蛮牛币
882
威望
0
注册时间
2013-11-7
在线时间
87 小时
最后登录
2019-3-29
2018-12-10 13:41:25 显示全部楼层
回复

使用道具 举报

7日久生情
1549/5000
排名
3443
昨日变化

0

主题

906

帖子

1549

积分

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

UID
210390
好友
0
蛮牛币
1830
威望
0
注册时间
2017-3-7
在线时间
209 小时
最后登录
2019-8-17
2018-12-10 14:01:46 显示全部楼层
回复

使用道具 举报

6蛮牛粉丝
1056/1500
排名
5514
昨日变化

0

主题

660

帖子

1056

积分

Rank: 6Rank: 6Rank: 6

UID
300432
好友
1
蛮牛币
1282
威望
0
注册时间
2018-10-18
在线时间
134 小时
最后登录
2019-8-21
2018-12-10 15:34:33 显示全部楼层
回复

使用道具 举报

6蛮牛粉丝
1056/1500
排名
5514
昨日变化

0

主题

660

帖子

1056

积分

Rank: 6Rank: 6Rank: 6

UID
300432
好友
1
蛮牛币
1282
威望
0
注册时间
2018-10-18
在线时间
134 小时
最后登录
2019-8-21
2018-12-10 15:36:10 显示全部楼层
6666666666666
回复

使用道具 举报

6蛮牛粉丝
1056/1500
排名
5514
昨日变化

0

主题

660

帖子

1056

积分

Rank: 6Rank: 6Rank: 6

UID
300432
好友
1
蛮牛币
1282
威望
0
注册时间
2018-10-18
在线时间
134 小时
最后登录
2019-8-21
2018-12-10 16:28:41 显示全部楼层
5555555555
回复

使用道具 举报

6蛮牛粉丝
1056/1500
排名
5514
昨日变化

0

主题

660

帖子

1056

积分

Rank: 6Rank: 6Rank: 6

UID
300432
好友
1
蛮牛币
1282
威望
0
注册时间
2018-10-18
在线时间
134 小时
最后登录
2019-8-21
2018-12-10 16:30:22 显示全部楼层
8888888888888
回复

使用道具 举报

6蛮牛粉丝
1138/1500
排名
16956
昨日变化

1

主题

729

帖子

1138

积分

Rank: 6Rank: 6Rank: 6

UID
199204
好友
1
蛮牛币
1098
威望
0
注册时间
2017-1-5
在线时间
368 小时
最后登录
2019-8-22
2018-12-11 11:10:39 显示全部楼层
谢谢分享
回复

使用道具 举报

7日久生情
2319/5000
排名
2248
昨日变化

0

主题

1285

帖子

2319

积分

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

UID
189581
好友
0
蛮牛币
3635
威望
0
注册时间
2016-12-5
在线时间
408 小时
最后登录
2019-8-23
2018-12-11 15:28:07 显示全部楼层
可以的给力啊
回复

使用道具 举报

5熟悉之中
803/1000
排名
4110
昨日变化

1

主题

271

帖子

803

积分

Rank: 5Rank: 5

UID
245227
好友
0
蛮牛币
987
威望
0
注册时间
2017-9-21
在线时间
172 小时
最后登录
2019-8-23
2018-12-12 09:15:37 显示全部楼层
很早以前有人做了个GPU Skining 就是这货的原型吧
回复 支持 反对

使用道具 举报

3偶尔光临
249/300
排名
12883
昨日变化

0

主题

120

帖子

249

积分

Rank: 3Rank: 3Rank: 3

UID
307869
好友
1
蛮牛币
265
威望
0
注册时间
2018-12-11
在线时间
59 小时
最后登录
2019-3-4
2018-12-12 22:36:31 显示全部楼层
球二次rfhjiolawodbhnujikol/sdrfvg
回复 支持 反对

使用道具 举报

5熟悉之中
759/1000
排名
5236
昨日变化

2

主题

203

帖子

759

积分

Rank: 5Rank: 5

UID
208267
好友
0
蛮牛币
1726
威望
0
注册时间
2017-2-24
在线时间
280 小时
最后登录
2019-8-23
2018-12-13 09:35:56 显示全部楼层
{:107:}
回复

使用道具 举报

5熟悉之中
759/1000
排名
5236
昨日变化

2

主题

203

帖子

759

积分

Rank: 5Rank: 5

UID
208267
好友
0
蛮牛币
1726
威望
0
注册时间
2017-2-24
在线时间
280 小时
最后登录
2019-8-23
2018-12-13 10:05:03 显示全部楼层
白天黑夜交错
回复

使用道具 举报

排名
21329
昨日变化

0

主题

49

帖子

84

积分

Rank: 2Rank: 2

UID
49997
好友
1
蛮牛币
53
威望
0
注册时间
2014-10-20
在线时间
13 小时
最后登录
2019-1-28
2018-12-13 11:41:57 显示全部楼层
66666666666666666666666666
回复 支持 反对

使用道具 举报

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

本版积分规则