Unite 2017 | 基于Animation Instancing的大规模人群模拟
在Unite 2017的国内技术专场,Unity技术团队为参会者们带来了Unity引擎功能相关的技术分享。今天这篇文章,将由Unity技术支持工程师金晓宇为大家分享基于Animation
Instancing的人群模拟技术,对于大型MMO游戏非常实用。
在实际开发中,可能经常会遇到类似需求:一个体育场中有大量的观众,或者有成百上千的僵尸在街道上游荡。对于这些类似的需求,如果采用传统的动画方式,CPU计算骨骼和蒙皮的压力会非常大。因为每一个角色都要有一个骨骼和蒙皮的计算过程,即使他们都播放的是同一个动画;除此之外,每个角色都至少有一个DrawCall,频繁的向GPU提交数据也为CPU带来了更多的压力。
上图是运用Animation Instancing的一个场景截图,这个场景中大约有30000个角色,每个角色有1~2千面,帧数可以稳定在60帧。Animation Instancing对于骨骼动画的限制较小,场景中的角色类型丰富,动画多样,非常适用于模拟大规模群体动画。
分析
本质上讲,Animation Instancing可以看做是GPU Instancing的扩展。因为他们的基本原理是相同的,只是在实现方法和细节上有所区别。我们都知道,GPU Instancing不支持带有骨骼动画的Mesh。这是因为带有骨骼动画的Mesh由于骨骼驱动蒙皮的原因其顶点数据(坐标)是不同的。
如果熟悉骨骼动画就会知道,动画在某一帧输出的最终Pose只有一个。然后通过这个Pose计算蒙皮,来确定最终的顶点位置。那么什么时候顶点位置是一样的呢?当然是没有动画的时候,也就是没有施加Pose的时候。即是处于绑定姿势(T-Pose)状态下的Mesh顶点位置一样。
因此很自然的就可以想到,我们所需要的顶点数据就是处于T-Pose下的数据。那么现在还有一个问题,动画该怎么处理呢?因为我们需要动画的Pose来计算蒙皮。如果能把Pose当做物体的独有数据提交给GPU,就可以在GPU计算蒙皮了,并且只需要提交给GPU一次就可以画出多个角色来了。
通过上面的分析,我们就可以组织我们所需要的数据了。
顶点数据:角色处于绑定姿势的顶点数据,以及骨骼索引及其权重
角色的独有数据:世界矩阵、骨骼动画数据、动画索引、当前动画播放时间(Normalized Time)
LOD
由于需要同屏绘制大量角色,所以LOD会带来很可观的性能提升。这是因为通常场景中会有很多角色离Camera比较远,因此这些角色没有必要使用高精度的模型,根据与Camera的距离,可以动态切换不同精度的模型。
而LOD应用在Animation Instancing上也是非常简单的。在不使用LOD时,角色只有一个顶点数据(如果这个角色只有一个材质的话)。
如果有LOD的话,只需要为每一个LOD等级生成一个顶点数据。再动态的根据离Camera的距离来切换顶点数据。这个过程是在CPU完成的,为了节省CPU资源,这个过程是不需要每帧进行的,比如我们可以每20帧来进行一次计算。
那么LOD会带来哪些好处呢?
首先它可以降低渲染的面数。同时这会为我们带来一个额外的好处:降低蒙皮的计算量。因为我们是在GPU计算蒙皮的,顶点数少了,自然蒙皮的计算量也少了。
其次它可以降低Overdraw。这是因为距离越远,一个高精度的Mesh就有更多的顶点集中在一个像素中,这会造成大量的Overdraw,而一个低精度的Mesh就可以大大降低这种可能性。
Animation Texture
为了节省在运行时计算骨骼的开销,我们可以把动画数据烘焙到Texture上。之后在运行时就可以采样这张Texture来获取到所需要的动画数据了。
这张Texture的结构大致如下图所示:
它由4个像素作为一个矩阵。一个Pose由N个矩阵组成。
GPU Skinning
最终我们需要在GPU来计算蒙皮,通过采样Animation Texture可以获取到我们所需要的蒙皮矩阵,再根据当前顶点所受影响的骨骼来计算蒙皮。如下面公式所示:
其中K是蒙皮矩阵,B是绑定姿势,C是当前姿势,V是顶点位置,w是骨骼权重。
优化
由于我们要实现成千上万的角色,也就是有成千上万的GameObject,而通常这些GameObject都会有Update方法。而这个数量级的方法调用开销已经是不可忽略得了。所以把这些GameObject的更新方法放在一个Manager中来调用是十分必要的。其次还需要特别注意Struct的拷贝开销。
Unity支持最大每顶点4根骨骼,因此我们也要支持每顶点最大4根骨骼。这里是有优化空间的,特别是加入LOD之后,对于那些离Camera非常远的角色,可以适当减少每顶点受影响的骨骼数目。比如离Camera非常远的角色我们让它每顶点只受一根骨骼影响,这虽然会使动画不太精确,但是实际影响不大。
在采样Texture时,虽然我们是用4个像素组成一个矩阵,但是矩阵的最后一维始终是(0,0,0,1),所以最后一维的采样是可以省略的。这可以使我们每根骨骼少采样一次。
优点
避免骨骼动画的计算开销(Animator.Update())
在GPU计算蒙皮(MeshSkinning.Update())
降低了CPU到GPU的数据传输
适合于大规模群体动画模拟的场景,如战争中的军队、体育场中的观众等
局限性
无法使用blend tree
不支持IK
动画精确性降低
当前,以即时战略、MMO游戏为代表,对大规模的群体动画的需求已经越来越多了。宏大的游戏场面可以大大增加游戏的沉浸感。而Animation Instancing就是一个实现大规模群体动画的十分合适的技术。
Unite 2017 | 基于Animation Instancing的大规模人群模拟的更多相关文章
- Unite 2017 | Unity引擎发展四大方向
Unite 2017 Shanghai已落幕,今天为大家分享本次大会备受关注的Keynote主题演讲.本次大会Keynote主题演讲聚焦了Unity全球领导团队,包括Unity创始人David Hel ...
- 王者齐聚!Unite 2017 Shanghai 日程讲师全揭晓
汇聚了来自全球的 Unity开发者.发行商.培训家及爱好者的 Unite 2017 Shanghai 即将于于 5 月 11 日-13日在上海·国际会议中心隆重举行.Unite 大会是由 Unity ...
- Unite 2017 | 从《闹闹天宫》看MOBA游戏里的网络同步技术
http://mp.weixin.qq.com/s/0v0EU79Q6rFafrh8ptlmhw 在Unite 2017 Shanghai案例分享专场,来自蓝港互动<闹闹天宫>项目组的主程 ...
- Unite 2017 干货整理 优化篇
Unite 2017 干货整理 优化篇 2017年05月16日 将Unite 2017的一些演讲做了整理. 本篇有内存,CPU.GC.UI.渲染性能指标.Tips几个小节. 内容持续整理中. 内存 ...
- 基于animation.css实现动画旋转特效
分享一款基于animation.css实现动画旋转特效.这是一款基于CSS3实现的酷炫的动画旋转特效代码.效果图如下: 在线预览 源码下载 实现的代码. html代码: <div class ...
- Unite 2017 干货整理 同步篇
http://www.kisence.com/2017/05/17/unite-2017-gan-huo-zheng-li-tong-bu-pian/ Unite 2017 干货整理 同步篇 2017 ...
- 基于Unity 5的次世代卡通渲染技术 -- Unite 2017 米哈游总监贺甲分享实录
在5月12日Unite2017开发者大会上,米哈游技术总监兼美术指导贺甲进行了主题为次世代卡通渲染的演讲.一下为详细分享内容: 大家好,首先自我介绍一下,我叫贺甲,在米哈游担任技术总监和美术指导工作, ...
- [转] X-RIME: 基于Hadoop的开源大规模社交网络分析工具
转自http://www.dataguru.cn/forum.php?mod=viewthread&tid=286174 随着互联网的快速发展,涌现出了一大批以Facebook,Twitter ...
- 基于Docker一键部署大规模Hadoop集群及设计思路
一.背景: 随着互联网的发展.互联网用户的增加,互联网中的数据也急剧膨胀.每天产生的数据量数以万计,本地文件系统和单机CPU已无法满足存储和计算要求.Hadoop分布式文件系统(HDFS)是海量数据存 ...
随机推荐
- Linux就该这么学--了解Shell脚本
有人曾经将Shell形容是人与计算机硬件的“翻译官”,Shell作为用户与Linux系统通讯的媒介.自身也定义了各种变量和参数,并提供了诸如循环.分支等高级语言才有的控制结构特性.如何正确的使用这些功 ...
- ORACLE DATABASE 10g EXPRESS EDITION LICENSE AGREEMENT
启动Tomcat之后出现全是英文错误: ORACLE DATABASE 10g EXPRESS EDITION LICENSE AGREEMENT To use this license, yo ...
- http://blog.csdn.net/renfufei/article/details/37725057/
版权声明:本文为博主原创文章,未经博主允许不得转载. 原创:http://blog.csdn.net/renfufei/article/details/37725057/ 说明: 首先,你需要注册一个 ...
- Codeforces Round #551 (Div. 2) A~E题解
突然发现上一场没有写,那就补补吧 本来这场应该5题的,结果一念之差E fail了 A. Serval and Bus 基本数学不解释,假如你没有+1 -1真的不好意思见人了 #include<c ...
- Linux tomcat安装详解
一.tomcat安装 1.下载JDK和Tomcat //通过wget下载 wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8 ...
- RQNOJ 329 刘翔!加油!:01背包
题目链接:https://www.rqnoj.cn/problem/329 题意: 刘翔有n封信,每封信都有自己的欣赏价值value[i].消耗时间time[i].消耗体力h[i].和得到的鼓舞w[i ...
- Java微信公众平台开发_05_微信网页授权
GitHub源码:https://github.com/shirayner/weixin_gz 一.本节要点 1.网页授权回调域名 登录微信公众平台后台, 开发 - 接口权限 - 网页服务 - 网页帐 ...
- 作业2nd
1. 国内: 雷军作为中国互联网代表人物及环球年度电子商务创新首领人物,曾获中国经济年度人物及十大财智首领人物.中国互联网年度人物等多项国表里荣誉,并当选<福布斯>(亚洲版)2014年度贸 ...
- 【Matlab】常用函数
1.取整函数 ceil(x)返回不小于x的最小整数值.floor(x)返回不大于x的最大整数值.round(x)返回x的四舍五入整数值.
- 【C++ Primer 5th】Chapter 15
摘要: 1. 面向对象程序设计的核心思想是数据抽象.继承和动态绑定.数据抽象将类的接口和实现分离:继承定义相似的类型并对齐相似关系建模:动态绑定,在一定程度上忽略相似类型的区别,而以统一的方式使用它们 ...