LiteralliJeff 发表于 2022-1-19 21:24

Unity 资产与序列化

昨天Unity官方的张靖老师过来讲了一下这方面内容,我跟他要来PPT写了下笔记总结。有需要的可以看看
如果以上哪里我理解有误,描述错误的可以私聊我   我在补充修改。



资产类型划分

Unity中的资产类型通过不同形式划分,可以分为:
本地资产和导入资产
运行资产和编辑器资产

本地资产即:我们放入到引擎中的资产

导入资产即:本地资产的导入设置meta与序列化info等


运行资产即:游戏打包后实际画面上看到的资产为运行资产

编辑器资产即:依托游戏引擎,在项目开发时使用的相关工具资产最后是不会参与到游戏打包的,例如ShaderGUI,技能配置工具等。



Meta文件与序列化文件

meta主要包含内容:





这里以V1(资源管线版本) 举例 我们找到图片资源27KB,通过meta文件中找到他的GUID,找到序列化之后的资产,再高压缩下的压缩设置下,序列化文件大小为351KB,图片资产还是27KB,项目显示为341.4KB。



当不压缩时,序列化文件大小为1.34MB,图片资产还是27KB,项目显示为1.3MB。

由此证明,我们使用的图片资产其实是固定的,我们在设置图片的所有导入设置,都在修改PNG衍生的Meta文件,我们实际使用的是储存在Library格式下的序列化文件,参与打包的也是序列化文件。







这里举例216M的PSD文件和1.04M的PNG文件,序列化后的资产都是0.7M。

那我们无论是使用PSD和PNG最后都会变成0.7M的图片的话,官方的意思是无论资产使用哪个最后使用的都是序列化资产,推荐使用PSD格式,因为方便二次编辑。

官方的意思我明白,可与此带来的其他问题,也是挺多的。
第一图片批处理,第二合图打图集。这些流程拿PSD文件都很费劲,这是我能想到的点,除此以外肯定还会有其他的点。

总结

说了这些简单总结一些事情:

[*]项目实际使用资产与本地图片资产无关
[*]项目中的资产设置不会影响资产本身
[*]项目中的资产设置储存在Meta文件中
[*]Meta文件中GUID标注的文件在Library→metadata文件中生成对应序列化文件为最终使用资源。


导入资源慢的原因

由以上可知,我们的每个资源大致都会衍生出其他的两个或两个以上的资产(meta文件,序列化文件,info文件)。
其实我们每次导入资产时都会新创建meta文件保证索引依赖与资源独立性,除了导入真正的资产同时,他要考虑资产设置,资产索引等很多问题所以会慢。在切PC 安卓ios环境同理,都会重新创建。

解决办法






[*]升级资源管线V2后,GUID的索引方式变为哈希值标注,比如PC下一个ID,安卓下一个ID,在切换时直接切换到另一套而不是新创建另一套所以会变快。
[*]Cache Server 缓存服务器   (未知-没涉及过-没听懂-没印象-忘记了)
[*]SSD机械硬盘

Unity自己创建的文件格式





以下文件格式为Unity自己研究的所以,离开Unity应该就打不开了,这与第三方资产格式完全不同,比如PNG图片,FBX模型无论你在Unity和UE还是其他地方都能打开,这是第三方资产格式的自由财产。
而场景,预制体,材质,动画剪辑为Unity自己创建的,所以这些资产拿到UE里就不行了。

Unity中的场景资产





YAML 版本
TAG标注
组件ID索引
组件名称

YAML Class ID

此ID个人理解为用来引用对应组件的索引ID



File ID

该ID为当前资产的内部引用(局部变量),他在下面会描述引用的这个东西是什么。
例:在场景渲染设置中,我的太阳这里引用了File ID,在后文描述了此ID引用的108即Light组件,相关灯光设置都再此ID下标注。



GUID

该ID为引用外部资产的ID,可以理解为场景引用了特效做好的预制体,或者场景引用了我写好的C#代码。



在场景中使用预制体与新建物体的差别





图中例为:我们在场景中新建了两个Cube,他会把Cube所涉及的所有信息在当前场景里准备一份,既是大小缩放位置,等资源都一致也会以对象为单位创建一份。
如果我们创建的两个Cube为引用预制体的话,他会通过引用预制体的形式直接拿去GUID下的meta设置。
由此结论:以预制体的资源引用,要比在场景中资源新建加载的速度要快。
这里我举个例子:假如场景中有做好的特效6个,它本身是一样的,其中4个为场景新建,无预制体索引,只是做到场景里,那么场景加载这个四个特效时要把所有特效的参数设置等在场景文件中列举出来,其中两个为引用相同预制体引用,他会通过GUID直接拿到资产设置。

Binary2Text

Unity内置的二进制转文本工具,可以将序列化的二进制文件转化为人类可以阅读的文本文件。





模型压缩与顶点压缩冲突原理:

过程有些麻烦直接总结,在序列化文件中顶点储存位置有两个,一个为VertexCount 和 CompressedMesh,如果启动模型压缩,顶点就会转到CompressedMesh下,
这样项目设置里的顶点压缩就拿不到VertexCount里的顶点,所以推荐Mesh Compression关掉。











Asset Database V1与V2的区别,V2为什么更快

V2的储存方式更接近数据库,与V1的引用(反射、链接)是有区别的。上文也讲了,V2会以哈希值为链接,虽然相比GUID更难理解,但是在切平台时确实更快了。











rustum 发表于 2022-1-19 21:31

划重点:过程有些麻烦直接总结,在序列化文件中顶点储存位置有两个,一个为VertexCount 和 CompressedMesh,如果启动模型压缩,顶点就会转到CompressedMesh下,

这样项目设置里的顶点压缩就拿不到VertexCount里的顶点,所以推荐Mesh Compression关掉。
页: [1]
查看完整版本: Unity 资产与序列化