GPU Skinning
这个工具的作用是同一种角色在同屏里面出现一大堆时,可以大幅度的降低DrawCall。我试了一下,感觉挺有意思的,各位可以试试。
它的原理实际上是把骨骼矩阵存在配置文件里面,然后通过特殊的shader,计算顶点的位置,直接在GPU端得到了网格模型的顶点在动画帧该在的位置。这一切由于是在GPU端直接得出结果,所以根本不会产生CPU的合并和DrawCall。这种做法,其实是很典型GPU骨骼动画做法,之前我在写AGAL的骨骼动画时,也是采用这种方式的。
下面来说说做法:
先去github下载最新的项目,该项目是开源的:https://github.com/chengkehan/GPUSkinning
然后打开项目,把之前做好的角色模型拖到场景里面,然后加上GPU Skinning Sampler脚本在模型的身上
加完脚本之后,会看到具体的设置,先填入需要保存的模型的名称(Animation Name),设置RootBone,然后根据需要设置动画片段的fps、循环等信息。

接下来根据下面的步骤,点击Play Scene和Start Sample,插件会让你选择一个保存的地方。

保存完之后,会有4个文件生成出来。我们随便建一个新的Empty GameObject,然后挂上GPU Skinning Player Mono的脚本,然后把刚才保存的4个文件拖到相应的位置,然后空物体就很神奇的出现了角色的网格模型。可以把这个gameObject保存成Prefab,然后就可以直接用了。
下面是运行的结果,生成了100个角色,虽然角色模型一样,但动作都是随机播放的。这时候看SetPass Calls,只有6个。

可以看出,如果GPU能力还过得去的话,这个做法还是不错的。而且插件本身也实现了动画事件的功能,可以满足一定的功能。
之后我拿了一台配置非常低的手机(红米note1代)运行了上面的demo,在生成到同屏65人左右,还能保持60帧满帧。之后由于同屏面数的增多,慢慢开始掉帧,同屏100人时帧率为43左右。同屏145人降到33帧左右。我使用测试的模型就是上图所示的,面数1500,骨骼大概30左右。
接下来说说不足的地方:
1、角色刚实例化出来后, GPU Skinning Player Mono上面的Player变量是空的,也就是说不能在实例化后立刻调用播放动画的方法,不然会报错。
2、我试了3个模型,其中有一个使用了多个子网格模型的角色生成出来的数据是错误的,估计还有bug。
3、虽然插件实现了动画事件,但和Unity原生的动画事件并不是同一回事,而且也不能用动画状态机,都是直接通过Play方法来播放对应的动画的。当然我很喜欢这种做法,但如果是本身项目就已经用了动画状态机和自带的动画事件,似乎就有点难直接套用这套GPU Skinning了。
4、最大的缺点,同屏显示同一个动作的模型,动作将会是一模一样的,也就是说如果10个模型都播放跑步动作,他们的动作将会是完全一致的。当然了,如果是播放攻击动作,只要攻击的间隔不一样,攻击完之后播放待机动作,也只会是刚好攻击的几个模型动作一致。
通过以上的测试结果,可以得出GPU Skinning功能大概适合用在同屏小兵很多,而且小兵的模型都是基本相同的几个模型。如果用在主角身上,由于动作会同步到一模一样,会比较难看。如果是做带很多兵的割草类游戏、塔防类游戏等,这个方案还是不错的。
GPU Skinning的更多相关文章
- GPU Skinning 结合 Instanced 高效实现大量单位动画
GPU Skinning 与 Instance 蒙皮动画 计算骨骼信息 蒙皮 GPU Skinning CPU Skinning 与 GPU Skinning 实现方式 Skinning 类型 优点 ...
- GPU Skinning不生效问题
1)GPU Skinning不生效问题2)勾选凸包报的警告问题3)Unity 2019 图片压缩格式选择4)Android Export打包对压缩的影响5)Android内存中的Unknown部分泄漏 ...
- U3D GPU蒙皮
在U3D中默认情况下是使用CPU蒙皮的,在BUILDING SETTING中的others中可以设置为GPU skinning
- Unity3D安卓打包参数配置与兼容性的关系分析
前言 在使用Unity3D工程导出安卓安装包的时候,往往会遇到兼容性的问题,针对某些机型,要么无法打开游戏,要么会出现卡机的现象.面对这种情况,我们可以调节相关的参数来提高兼容性. 为了了解在打包时候 ...
- Unity 5.4大赞:HTC Vive经典The lab渲染器开源
HTC Vive提供了一个不错的免费VR demo,最近1周仔细体验了一番. 仔细看了其安装文件,竟然是Unity 5.4beta版本(通过查log,知道Valve公司用的是最新的5.4.0b11版本 ...
- FPS手游如何脱颖而出?看《CF手游》的性能突破之路
WeTest导读 俗话说:用户体验不谈性能就是耍流氓. 在PC游戏上的性能问题并没有那么明显, 加个内存换个CPU或者刷个主频就能轻松搞定:到了手游时代后情况则显得比较严峻,捉襟见肘的内存使得资源加载 ...
- Unity 5 Game Optimization (Chris Dickinson 著)
1. Detecting Performance Issues 2. Scripting Strategies 3. The Benefits of Batching 4. Kickstart You ...
- Unity Optimization UNITY优化关注列表
这里主要罗列Unity引擎进行开发的应用或游戏,可以进行优化的各个关注点.(此文会持续更新) C# GC alloc Update LateUpdate Serialize String ToStri ...
- Unity MMORPG游戏优化经验分享
https://mp.weixin.qq.com/s/thGF2WVUkIQYQDrz5DISxA 今天由Unity技术支持工程师高岩,根据实际的技术支持工作经验积累,分享如何对Unity MMORP ...
- Unite 2017 | 基于Animation Instancing的大规模人群模拟
在Unite 2017的国内技术专场,Unity技术团队为参会者们带来了Unity引擎功能相关的技术分享.今天这篇文章,将由Unity技术支持工程师金晓宇为大家分享基于Animation Instan ...
随机推荐
- VUE学习-计算属性与监听器
计算属性与监听器 计算属性 当 vm.message 发生改变时,所有依赖 vm.reversedMessage 的绑定也会更新 <div id="example"> ...
- 如何利用python的xlrd模块读取日期格式的Excel
经常使用python操作Excel,就会遇到各种坑,比如,有时候你读取到的某一单元格的数据,你预想的结果本来应该是这样的,但是它却是这样的,真是很蛋疼.于是你会找各种解决办法,去解决这个问题!所以鄙人 ...
- Safari高级使用
Safari是苹果公司为旗下设备开发的一款强大的浏览器不论是iPhone还是iPad亦或是MAC OS上都能使用.但是针对不同的系统,Safari也有一定的改动.那么在MacOS中如何使用Safari ...
- vue3+ts获取dom元素高度
vue3+ts获取dom元素高度 <template> <div class="digestDetail-indedx"> <div class=&q ...
- WPF Binding表达式
前言: WPF BindingBinding表达式的使用,可以很方便的绑定参数和更新界面数据. 1.界面添加控件,并设置对应属性的Binding表达式,例如: <Window x:Class=& ...
- Absolute Path Traversal 错误解决
Absolute Path Traversal (APT) 是一种常见的安全漏洞,攻击者可以通过该漏洞访问应用程序的文件系统中的文件, 包括敏感信息,从而可能导致应用程序遭受攻击. 一.使用专门的文件 ...
- Sharp7与S7NetPlus 性能测试
介绍 Sharp7和都S7NetPlus是纯C#实现的基于以太网与S7系列的西门子PLC通讯的开源库.都支持.net core 跨平台可以部署在linxu, docker,windwos 中. 测 ...
- C 语言 数制
C 语言 数制 数制也称计数制,是指用一组固定的符号和统一的规则来表示数值的方法.计算机处理的信息必须转换成二进制形式数据后才能进行存储和传输.计算机中,经常使用的进制有二进制.八进制.十进制.十六进 ...
- jmeter之【报错记录】
{ "code": "E0001", "success": false, "description": "Co ...
- Logtxt
public static void SSOAuthenLog(string msg, bool isRemoteAuthen = true) { #region ...