Skip to content

资产身份 ​

首先在最早的实现当中, 是直接使用文件路径作为唯一的身份标识, 对于当时的那个小 demo 是没有问题的. 但是其实存在很严重的问题 ——

比如我们在代码中写了 LoadTexture("/path01/texture.png") 在今天可以运行, 但是等第二天我移动了文件路径, 那么原则上如果程序是写死的话, 那么就报错文件不存在了. 这很坏, 而且退一步来说, 其实从语义上这二者应该是表示同一个资产, 因为其实文件内容和其表示的语义没有变化, 仅只路径移动了, 但是在当前的设计当中它却被认作是不同的资产.

当然, 我们不可避免的要记录源文件路径, 它是我们定位文件的唯一手段, 接下来要说明的只是如何判断资产”身份“的事情, 所以在一开始需要先把身份逻辑和定位加载的逻辑分开 —— 一个资产确乎是对应唯一的路径, 但是这个路径不能表示资产的身份, 因为路径移动并不能说明资产的身份也随之改变.

再来个例子, 比如

Material1 -> "Assets/Textures/A.png"
Scene1    -> "Assets/Textures/A.png"
Prefab1   -> "Assets/Textures/A.png"

现在各个模块都和文件路径耦合, 所以如果在编辑器中直接对一个文件进行路径修改的话, 那么就需要遍历所有的耦合模块进行更改, 很坏. 于是引入一层稳定身份, 那么上游只需要依赖稳定身份即可 ( 在当前设计中使用了 AssetReference 表示对逻辑资产的持久使用, 因为其可序列化写进文件作持久化. ), 对于文件的定位我们丢给 Asset 层来实现.

那么为了表示一个资产是这个资产, 我们使用了 GUID 来进行标识 —— 就好像我们确乎需要你的家庭地址, 因为只能通过这个来定位你在哪. 不过你可以搬家, 但想要换身份证却是一件难事. 所以 GUID 相当于身份证的作用, 作为标识资产的唯一身份.

此时又来了一个新的问题 —— 我们的 GUID 是在程序运行时期生成的, 那么等程序结束之后, GUID 就随之消散, 这很坏, 我们希望可以让 GUID 也持久化. 那么写入文件 —— 写一个 .meta 文件的思路就出来了.

那么在 Runtime 的时候, 我们加载一个资源存进自己的 SlotMap 中, 此时有一个 Runtime Handle, 这就是它在运行时的资产身份.

综上所述, 我们不能用文件路径作为身份的稳定身份, 而使用 GUID, 同时使用 meta 文件作 GUID 等信息等持久化, 最后在 Runtime 的时候用 Handle 作为新的身份.

Released under the MIT License.