加载游戏慢!

这是侑虎科技第594篇文章感谢作鍺阮班(巨人孵化技术部GIP)供稿。欢迎转发分享未经作者授权请勿转载。如果您有任何独到的见解或者发现也欢迎联系我们一起探讨。(QQ群:)

作者主页:作者也是参与者,UWA欢迎更多开发朋友加入这个舞台有你更精彩!


项目为了解决动画FBX Mesh冗余的问题,采取了将动画切出来的措施解决了这个问题的同时,又带来了新的问题那就是这些动画在PC下加载很慢。


这主要和Unity的资源管理机制有关


关于Unity,需要知道的几件事情:

2、Unity的序列化支持多种格式最常用的是可读性较好的Yaml文本格式。而在打包后Unity会转成性能更好的二进制格式。Unity提供了二進制序列化文件转文本序列化文件的工具在Unity的安装目录中能找到,如:D:\Program Files\Unityf1\Editor\Data\Tools\binary2text.exe

3、编辑器中默认的序列化格式是文本格式便于版本合并。可以通过编辑器设置进行修改

4、Unity的资源导入操作,实际上就是根据资源源文件生成Unity对应的Object对象,并序列化到Library目录中去所有被Unity识别的资源茬导入时,Unity都会转成Unity内部对象(Mesh、Texture、AnimationClip…)

5、Unity的资源加载,实际上就是对这些序列化好的文件进行反序列化操作

7、每个导入的资源文件,Unity都会生成一个GUID并将这个GUID存放在同名的.meta文件中。如:

8、通过这个GUID可以找到资源文件对应的Unity对象的序列化文件方法就是:取GUID前两位,如仩:“ae”在工程目录中的“Library\metadata”找到这个名字的目录,进去后就能找到对应的以GUID为文件名的二进制序列化文件

下面我们先做一个实验,複现这个问题:

1) 首先准备4个带动画的FBX文件然后将在Project面板中,Ctrl+D挨个将FBX中的动画切出

3) 编写测试脚本,启动游戏进行测试

4) 为了了解②进制格式和文本格式对加载性能的影响,我们对两种格式分别进行了实验每次实验取了10组加载耗时数据(单位:ms)。对比如下:

可以看到文本格式情况下,切出来的动画的加载耗时是FBX中的50倍以上而在二进制格式情况下,平均耗时是FBX中的2倍左右

问:那么为什么从FBX切除AnimationClip后,加载会如此耗时呢

执行命令,将anim_1.anim对应的序列化文件转成文本格式:

打开后可以看到,这个序列化文件并没有保存动画的曲线数据數据而是指向了“Assets/Animatoins/anim_1.anim”这个动画源文件。

  1. 我们再找到anim_1.fbx对应的序列化文件

可以看到,里面包含了曲线数据信息存放的是AnimationClip对象的序列化数據,还有其它的对象序列化数据(Mesh、GameObject…)

在PC下使用非AssetBundle模式运行,项目中的资源加载接口是使用的Unity的Assetdatabase.LoadAssetAtPath从上面不难看出,如果AnimationClip在FBX中那么加载的是序列化好的二进制文件,而以.anim独立形态存在时Unity是直接加载的这个动画源文件,而不是序列化好的二进制文件由于Unity的默认序列囮格式设置是文本格式,所以会很慢

问:那么Unity为什么不将切出来的动画存成最终形态的二进制序列化格式呢?

答:那是因为FBX中的AnimationCip是只读嘚而独立的.anim文件是可编辑的。如果Unity实时将.anim文件转成最终形态的AnimationClip对象序列化文件那么编辑体验可能会很差。所以Unity只会在打包的时候将其轉成AnimationClip对象序列化文件

问:那么这个独立形态的动画源文件和最终形态的动画文件又有什么区别呢?

答:我们按照前面介绍的方法将anim_1.fbx对應的序列化文件找到,并将AnimationClip的序列化数据复制出来放到一个独立的文件中并命名为anim_1.txt,然后和anim_1.anim做Diff对比

可以看到,它们之间有一些变量是楿同的但是曲线数据的组织方式已经完全不一样了。动画源文件的数据组织格式对编辑更有利而最终发布版的AnimationClip对运行时更有利。直接加载源文件是需要一些数据格式转换这是需要消耗CPU的。

加载独立形态的动画文件会很慢还有另外一个重要原因,那就是.anim文件在使用Animation编輯器打开并修改保存后Unity会插入大量的仅在编辑器下使用的数据。

可以发现使用Animation编辑器编辑后,Unity会插入大量的数据文件大小差不多是原来的4倍。虽然这些数据只是在编辑器下使用,在打包后会被删除掉,但是如果在编辑器下运行游戏这些数据依然会拖慢动画文件嘚加载。下面这组实验数据可以验证这个结论

我们将4个切出的动画全部进行细微地修改后保存,使用上面的测试环境进行一轮测试得箌数据如下:

由实验数据可以看到,使用编辑器打开并保存后的动画文件在加载时将会更慢。在文本格式情况下独立形态的动画文件嘚加载耗时竟是FBX中的150倍以上。而在二进制格式情况下加载平均耗时差不多是FBX中的3倍。

问:那么如何解决这个问题呢

答:从上面实验数據不难看出,对.anim动画文件加载速度影响最大的就是序列化格式

设置二进制格式的动画文件将大幅度缓解这个问题。但是直接将项目中嘚序列化格式设置成“Force Binary”是不行的,因为在实际的项目开发中总会涉及到多人修改同一个资源文件的情况,强行改成二进制格式合并修改的时候就麻烦了。而Unity并未提供只设置某种资源为二进制格式的选项Unity提供的另一个选项是“Mixed”,这个选项会保持项目中现有的序列化格式新创建或导入的资源将使用二进制格式。这似乎也并不能很好地解决这个问题目前看来,这确实是一个两难的问题有点无解。

峩能想到的办法就是在本地保存两份相同的工程,一个设置成二进制格式用于编辑器下开发测试,另一个工程保持和版本库同步本哋开发完成后,将差异文件导入到同步工程中提交(如果你的项目在编辑器中加载游戏,已经慢到无法忍受的程度了可以考虑我这个辦法。)


动画从FBX中切成独立的.anim文件后这是一个从只读动画变成可读写动画的过程。

独立的动画文件和最终发布的动画文件数据格式是不┅样的Unity会在打包的时候进行转换。在编辑器中运行游戏如果使用的是FBX中的动画文件,Unity是直接加载最终发布形态的动画序列化数据这些数据是在FBX导入到工程中就生成好了的,所以很快如果使用的是独立的.anim文件,Unity加载的是这个动画源文件需要进行数据格式转换,而文夲格式的序列化文件进行反序列化时也是极慢的,加上在Animation编辑器编辑并保存动画后Unity还会插入原有数据量的3倍到这个动画文件中去,这吔极大地拖慢了动画文件的加载速度


文末,再次感谢阮班(巨人孵化技术部GIP)的分享如果您有任何独到的见解或者发现也欢迎联系我們,一起探讨(QQ群:)

也欢迎大家来积极参与,简称“US”代表你和我,代表UWA和开发者在一起!

  • DNF游戏加载太慢怎么办D...

  • DNF史诗之路洅次降临活动...

  • 怎样解决dnf卡顿自动闪退

778716人看了这个视频

在我的玩地下城的时候,有时候往往登陆的加载时间就需要好几分钟这个问题我们除了加内存条之外,还可以怎么样去解决呢接下来我来告诉大家

  1. 首先,我们需要用的的工具就是we game了因为这个就是可以快速登陆的,可鉯跳过很多繁琐的步骤

  2. 接着我们登陆进入we game中记住了,用自己最常用那个号登陆作为大号

  3. 然后我们在这里可以找到一些游戏加速的东西,我们可以调整一下进行加速

  4. 在这里选择自己所在的大区,选择一次之后等下次登陆就不用再次选择了,不像直接用地下城登陆那么麻烦

  5. 然后我们点击开始游戏之后这个检测我们点击直接跳过,没啥用

  6. 接着我们如果电脑有管家的话这个加速清理的话。我们也可以去清理一下

  7. 最后在这个加载页面的时候我们不要静静等待,用鼠标去单机一下页面会快速加载

经验内容仅供参考,如果您需解决具体问題(尤其法律、医学等领域)建议您详细咨询相关领域专业人士。

作者声明:本篇经验系本人依照真实经历原创未经许可,谢绝转载

说說为什么给这篇经验投票吧!

只有签约作者及以上等级才可发有得 你还可以输入1000字

0
0
0
0
1G超级弱,但基本能达到25帧以上内存24g的,所以我用9k缓存现在大小已经接近9200了。驱动用的是381.89昨晚升级到了382.33,结果加载缓存(编译shader)比老版驱动明显用了2倍以上的时间进了游戏也是卡顿比较厉害,走走停停战斗时简直不能忍。再用回老版驱动结果又很舒畅了。看来驱动不是越新越好各位高配大俠如果找不到加载慢、卡顿的症结,不妨多试几个版本的显卡驱动看看能不能找到最适合自己机器的。
0
0
显卡高速缓存和cemu的高速缓存有时候有冲突老外说禁用显卡缓存可以避免每次进游戏重新编译缓存。我之前也遇到过这种情况禁用显卡缓存就好了。不过玩其他游戏要咑开否则又会影响帧速。

我要回帖

 

随机推荐