查看原文
其他

程序丨Unity3D游戏在启动时都默认加载哪些资源?

2017-09-07 破土君 Gad-腾讯游戏开发者平台

我们都知道使用Unity3D引擎制作的游戏在冷启动时会加载一些默认的资源,包括纹理资源、Shader、Mesh等,这些资源都是Unity3D引擎默认需要的。


那么我们如何知道这些默认资源到底是哪些呢?为了深入理解这个主题,我们把这个问题分解成以下两个子问题:

  1. Unity3D引擎会包含哪些默认资源?

  2. Unity3D引擎在从冷启动到开始加载第一个场景(Scene)时,需要加载哪些资源呢?


第一个问题也就是游戏的包体中会包含哪些非用户添加的资源,这些资源是Unity3D引擎自动添加的资源,最终也会打包进游戏里面,占用包体大小。


第二个问题是游戏在运行时,从用户点击游戏开始冷启动,到显示启动屏(Splash Screen),直到开始加载第一个游戏场景前,Unity3D引擎需要把哪些资源加载到内存中?我们称之为冷启动时需要加载哪些资源,这些冷启动需要加载的资源直接影响游戏的冷启动时间。


Unity3D引擎会包含哪些默认资源?


分析这个问题,我们可以用Unity3D创建一个新的空工程,只有一个场景,场景上不挂在任何GameObject(把默认添加的MainCamera等删除掉)。这样的空工程可以保证工程里面没有任何用户引入的资源,保证工程的干净,方便我们分析。然后,我们可以导出一个Android的APK包。


这个APK包已经是Unity3D引擎最小的包体大小了,我们可以看到这个包体仍然有 21.5MB 之大,而我们使用AndroidStudio创建一个空的工程,导出的APK只有 1.8MB ,相比而言,Unity3D的包体还是蛮大的。


APK就是一个zip压缩包,把后缀 .apk 替换为 .zip ,就可以把APK包解压出来,从包体里面我们就可以看到有哪些资源了。如果你使用Mac,那么你可以使用 tree 命令来得到如下的图示:



我们可以看到 assets/bin/Data/ 目录下面有Unity3D引擎的 .dll 文件,以及 lib/ 目录下的 .so文件,这些都是Unity3D引擎的代码文件,剩下的那些就是Unity3D引擎引入的资源文件。


我们重点关注上图中划红线的 unity_builtin_extra 和 unity default resources 这两个文件,它们在文件大小上是资源文件中最大的。


从文件名的命名上我们可以猜想这些应该就是Unity3D引擎引入的默认资源,那么我们怎么才能看到这些资源到底是什么呢?由于这些文件是类似于AssetBundle的文件格式,所以我们需要首先把这两个文件进行拆包,然后才可以看到其内部结构。


我使用的 DevXUnityUnPack 这个工具进行拆包操作,这个工具很强大,可以直接对APK文件进行拆包。



我们重点关注 unity_builtin_extra 和 unity default resources 这两个文件里面有哪些资源:



你会看到 unity_builtin_extra 里面都是Shader文件,而 unity default resources 里面则包含纹理、默认的Arial字体、材质、Shader等。


Unity3D引擎冷启动时需要加载哪些资源?


我们如何分析哪些资源被加载了呢?我们可以使用Resources.FindObjectsOfTypeAll 方法来列出来哪些文件被加载了,它会把内部的对象以及被Disable的对象也列出来。


我们在场景上新建一个 obj1 GameObject, 并挂在 Test.cs 脚本, Test.cs 代码如下:



游戏场景结构如下所示:



我们在Android手机上运行游戏( 注意:一定要在真机上运行,在Editor里面运行得到的信息是不准确的,会把Unity3D Editor加载的资源也列出来 ),可以得到下面的 logs.txt 信息:



我们会发现这么简单的一个场景,在冷启动时,足足需要加载216个对象!是不是有点吃惊呢。这些对象有Shader、Texture2D、TextAsset等,比如GraphicsSettings、UnityNormalMap、Sprites/Default等, 很大一部分都是Unity3D引擎默认需要的。我们重点来关注我们自己引入的对象:



Test.cs 代码本身就是一个 TextAsset,需要在启动时进行加载。 obj1 是场景里面的GameObject 的名字,它所挂载的 Transform 组件也需要被加载。


即使代码脚本没有被使用,它也会在冷启动时加载,所以,如果一个大型项目里面有很多的代码文件,那么这些代码文件都需要被加载,这将会影响游戏的冷启动时间。所以,如果有很多的代码文件,可以考虑把这些代码文件打包成一个 .dll 文件,这样可以减少碎片化文件的加载时间,从而减少冷启动时间,加快游戏启动速度。


----------------------

今日推荐


8月资料包下载丨精选热文盘点

如何加快Unity3D游戏的冷启动时间?

Unity渲染基础系列教程(九):复杂材质

在UE4中,光照贴图UV坐标如何快速生成?



添加小编微信,可享双重福利

1.加入GAD程序猿交流基地

获取行业干货资讯,观看大牛分享直播

2.领取60G独家程序资料库,地址在小编朋友圈

包括腾讯内部分享、文章教程、视频教程等全套资料

 

↓长按添加小编GAD苏苏↓

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存