找回密码
 注册帐号

扫一扫,访问微社区

外文翻译 Render- Animation Instancing

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

7606

主题

8152

帖子

3万

积分

Rank: 16

UID
1231
好友
186
蛮牛币
10020
威望
30
注册时间
2013-7-29
在线时间
3924 小时
最后登录
2019-4-24

活力之星原创精华达人突出贡献奖财富之证游戏蛮牛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日久生情
2233/5000
排名
1394
昨日变化

0

主题

693

帖子

2233

积分

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

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

使用道具 举报

5熟悉之中
719/1000
排名
6932
昨日变化

0

主题

442

帖子

719

积分

Rank: 5Rank: 5

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

使用道具 举报

7日久生情
1527/5000
排名
3444
昨日变化

0

主题

888

帖子

1527

积分

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

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

使用道具 举报

6蛮牛粉丝
1052/1500
排名
5543
昨日变化

0

主题

659

帖子

1052

积分

Rank: 6Rank: 6Rank: 6

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

使用道具 举报

6蛮牛粉丝
1052/1500
排名
5543
昨日变化

0

主题

659

帖子

1052

积分

Rank: 6Rank: 6Rank: 6

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

使用道具 举报

6蛮牛粉丝
1052/1500
排名
5543
昨日变化

0

主题

659

帖子

1052

积分

Rank: 6Rank: 6Rank: 6

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

使用道具 举报

6蛮牛粉丝
1052/1500
排名
5543
昨日变化

0

主题

659

帖子

1052

积分

Rank: 6Rank: 6Rank: 6

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

使用道具 举报

6蛮牛粉丝
1032/1500
排名
16954
昨日变化

1

主题

693

帖子

1032

积分

Rank: 6Rank: 6Rank: 6

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

使用道具 举报

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

0

主题

1286

帖子

2294

积分

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

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

使用道具 举报

5熟悉之中
746/1000
排名
4111
昨日变化

1

主题

235

帖子

746

积分

Rank: 5Rank: 5

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

使用道具 举报

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

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熟悉之中
686/1000
排名
5235
昨日变化

2

主题

197

帖子

686

积分

Rank: 5Rank: 5

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

使用道具 举报

5熟悉之中
686/1000
排名
5235
昨日变化

2

主题

197

帖子

686

积分

Rank: 5Rank: 5

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

使用道具 举报

排名
21326
昨日变化

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
回复 支持 反对

使用道具 举报

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

本版积分规则