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 ...
随机推荐
- js判断当值的比较小的背景为红色
<!DOCTYPE html> <html> <head> <title></title> </head> <body&g ...
- QSlider CSS样式
QSlider::groove:horizontal{ border:0px; height:15px; background:#deffe5; } QSlider::sub-page:horizon ...
- jmeter的阶梯式加压性能测试 jp@gc - Stepping Thread Group (deprecated)
当测试需求要求是阶梯型的压力测试场景时,使用该线程组. 比如测试场景是 从100并发开始,每60s加压50并发,直至达到目的并发数(中途发现问题随时停掉),之后保持每60s停止50并发的速率关闭 ...
- 常见DOS命令及应用
常见DOS命令使用 CMD打开方式 开始 + 系统 + 命令提示符 WIN键 + R 输入cmd + Enter WIN键 + R 输入cmd + Ctrl + Shift + Enter (管理员模 ...
- CentOS系统 / 目录下每个子目录的作用
Text. 1./bin 该目录存放root和交互式登录用户使用的二进制可执行文件,如cat,cp,date,rm等. 2./boot 该目录主要存放系统启动所需要的相关文件,如何内核文件vmlinu ...
- 打包Assetbundle
using UnityEngine;using System.Collections;using UnityEditor;/// <summary>/// 脚本位置:Editor文件夹下/ ...
- go: go.mod file not found in current directory or any parent directory; see 'go help mod 解决
go: go.mod file not found in current directory or any parent directory; see 'go help mod go:在当前目录或任何 ...
- CCF 202009-2 风险人群筛查
#include <iostream> #include <bits/stdc++.h> #include <string> using namespace std ...
- openSUSE 播放使用VLC播放视频
openSUSE 使用VLC播放视频 linux视频播放 为什么 通常我们在安装号vlc后,由于版权的原因,是无法获取视频的解码器的.我们需要下载第三方的解码器帮助我们进行解码. 过程如下: 添加pa ...
- Sky Full of Stars
题目链接: luogu cf 题目大意: 给定一个 \(n \times n\) 的矩形,在里面填充三种颜色,求使得至少一行或至少一列同色的方案数. 解法 容斥 我们不去考虑反演,直接开始容斥,我们不 ...