剖析CocosCreator新资源管理系统

论坛 期权论坛     
niminba   2021-5-15 21:02   16   0
<h2>1.资源与构建</h2>
<h3>1.1 creator资源文件基础</h3>
<p>在了解引擎如何解析、加载资源之前,我们先来了解一下这些资源文件(图片、Prefab、动画等)的规则,在creator项目目录下有几个与资源相关的目录:</p>
<ul>
    <li>assets 所有资源的总目录,对应creator编辑器的资源管理器</li>
    <li>library 本地资源库,预览项目时使用的目录</li>
    <li>build 构建后的项目默认目录</li>
</ul>
<p style="text-align: center;"><img alt="" src="https://beijingoptbbs.oss-cn-hangzhou.aliyuncs.com/jb/2426819-bcebb1be8959139399497da1691cc0a7"></p>
<p>在assets目录下,creator会为每个资源文件和目录生成一个同名的.meta文件,meta文件是一个json文件,记录了资源的版本、uuid以及各种自定义的信息(在编辑器的<code>属性检查器</code>中设置),比如prefab的meta文件,就记录了我们可以在编辑器修改的optimizationPolicy和asyncLoadAssets等属性。</p>
<p style="text-align: center;"><img alt="" src="https://beijingoptbbs.oss-cn-hangzhou.aliyuncs.com/jb/2426819-352381d2bbd404be9beeb162a604f34d"></p>
<div class="blockcode">
<pre class="brush:js;">
{
  "ver": "1.2.7",
  "uuid": "a8accd2e-6622-4c31-8a1e-4db5f2b568b5",
  "optimizationPolicy": "AUTO",     // prefab创建优化策略
  "asyncLoadAssets": false,         // 是否延迟加载
  "readonly": false,
  "subMetas": {}
}</pre>
</div>
<p>在library目录下的imports目录,资源文件名会被转换成uuid,并取uuid前2个字符进行目录分组存放,creator会将所有资源的uuid到assets目录的映射关系,以及资源和meta的最后更新时间戳放到一个名为uuid-to-mtime.json的文件中,如下所示。</p>
<div class="blockcode">
<pre class="brush:js;">
{
  "9836134e-b892-4283-b6b2-78b5acf3ed45": {
    "asset": 1594351233259,
    "meta": 1594351616611,
    "relativePath": "effects"
  },
  "430eccbf-bf2c-4e6e-8c0c-884bbb487f32": {
    "asset": 1594351233254,
    "meta": 1594351616643,
    "relativePath": "effects\\__builtin-editor-gizmo-line.effect"
  },
  ...
}</pre>
</div>
<p>与assets目录下的资源相比,library目录下的资源合并了meta文件的信息。文件目录则只在uuid-to-mtime.json中记录,library目录并没有为目录生成任何东西。</p>
<h3>1.2 资源构建</h3>
<p>在项目构建之后,资源会从library目录下移动到构建输出的build目录中,基本只会导出参与构建的场景和resources目录下的资源,及其引用到的资源。脚本资源会由多个js脚本合并为一个js,各种json文件也会按照特定的规则进行打包。我们可以在Bundle的配置界面和项目的构建界面为Bundle和项目设置</p>
<p style="text-align: center;"><img alt="" src="https://beijingoptbbs.oss-cn-hangzhou.aliyuncs.com/jb/2426819-da42949d3398c801c30cd69aab2167b0"></p>
<p>1.2.1 图片、图集、自动图集</p>
<ul>
    <li>https://docs.cocos.com/creator/manual/zh/asset-workflow/sprite.html</li>
    <li>https://docs.cocos.com/creator/manual/zh/asset-workflow/atlas.html</li>
    <li>https://docs.cocos.com/creator/manual/zh/asset-workflow/auto-atlas.html</li>
</ul>
<p>导入编辑器的每张图片都会对应生成一个json文件,用于描述Texture的信息,如下所示,默认情况下项目中所有的Texture2D的json文件会被压缩成一个,如果选择<code>无压缩</code>,则每个图片都会生成一个Texture2D的json文件。</p>
<div class="blockcode">
<pre class="brush:js;">
{
  "__type__": "cc.Texture2D",
  "content": "0,9729,9729,33071,33071,0,0,1"
}</pre>
</div>
<p>如果将纹理的Type属性设置为Sprite,Creator还会自动生成了SpriteFrame类型的json文件。<br>
图集资源除了图片外,还对应一个图集json,这个json包含了cc.SpriteAtlas信息,以及每个碎图的SpriteFrame信息<br>
自动图集在默认情况下只包含了cc.SpriteAtlas信息,在勾选内联所有SpriteFrame的情况下,会合并所有SpriteFrame</p>
<p>1.2.2 Prefab与场景</p>
<ul>
    <li>https://docs.cocos.com/creator/manual/zh/asset-workflow/prefab.html</li>
    <li>https://docs.cocos.com/creator/manual/zh/asset-workflow/scene-managing.html</li>
</ul>
<p>场景资源与Prefab资源非常类似,都是一个描述了所有节点、组件等信息的json文件,在勾选<code>内联所有SpriteFrame</code>的情况下,Prefab引用到的SpriteFrame会被合并到prefab所在的json文件中,如果一个SpriteFrame被多个prefab引用,那么每个prefab的json文件都会包含该SpriteFrame的信息。而在没有勾选<code>内联所有SpriteFrame</code>的情况下,SpriteFrame会是单独的json文件。</p>
<p>1.2.3 资源文件合并规则</p>
<p>当Creator将多个资源合并到一个json文件中,我们可以在config.json中的packs字段找到被<code>打包</code>的资源信息,一个资源有可能被重复打包到多个json中。下面举一个例子,展示在不同的选项下,creator的构建规则:</p>
<ul>
    <li>a.png 一个单独的Sprite类型图片</li>
    <li>dir/b.png、c.png、AutoAtlas dir目录下包含2张图片,以及一个AutoAtlas</li>
    <li>d.png、d.plist 普通图集</li>
    <li>e.prefab 引用了SpriteFrame a和b的prefab</li>
    <li>f.prefab 引用了SpriteFrame b的
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1060120
帖子:212021
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP