文件系统

虚拟文件系统使用类似磁盘的概念对零散文件进行集中管理,优化资源加载时产生的内存分配,甚至可以对资源进行局部片段加载,这些都将极大提升资源加载时的性能。

常规用法

获取文件系统组件

检查是否存在文件系统

获取文件系统

创建文件系统

文件系统块数据(Block)是 Game Framework 文件系统中引入的一个数据结构,用于索引文件内容数据区在文件系统中的偏移、长度等信息。即使文件从文件系统中被删除,文件系统块数据依然会保留,并将原先的文件内容数据区标记为文件系统碎片。

文件系统当前已使用的块数据数量 = 文件系统当前文件数量 + 文件系统当前碎片数量

显然,一个文件系统最大能容纳的块数据数量不应少于最大能容纳的文件数量。
当文件系统增加新文件时,会优先分配合适的文件系统碎片的空间用于存储新文件。

加载文件系统

销毁文件系统

获取文件系统数量

获取所有文件系统集合

文件系统相关操作

参考手册

最佳实践

创建文件系统时,合理设置 MaxFileCount 和 MaxBlockCount

创建文件系统时,需要设置 MaxFileCount(能容纳的最大文件数量)和 MaxBlockCount(能容纳的最大块数据数量),这两个参数决定了文件系统初始化化时头部块的大小。

一般来说,用于存储不变资源的只读文件系统,假设需要写入 N 个文件,那么 MaxFileCount 和 MaxBlockCount 都设置为 N 即可。

用于存储可变资源的文件系统,根据预估文件数量,设置合适的 MaxFileCount 即可,MaxBlockCount 可根据此文件系统中文件更新的频率,设置为 MaxFileCount 的 2 ~ 32 倍是比较合适的,文件系统中的文件被更新频率越高,倍数可以相应设置的越高。当文件系统碎片占用的块数据过多导致所有块数据被填满时,等同于触发文件系统容量已满,无法再写入新文件。

备注:在后续版本的文件系统中,Game Framework 有计划引入 MaxFileCount 和 MaxBlockCount 的自动扩充机制和文件系统碎片整理机制。

单个文件系统的实际大小不要超过 4GB

Game Framework 实际支持单个大小超过 4GB 的文件系统,但由于受以下因素的制约,并不建议使用超过 4GB 的文件系统,而在文件系统大小接近 4GB 前,应拆分出新的文件系统。

读写文件时考虑使用带有 buffer 缓存的重载方法

读取文件和文件片段时,可以预先准备好一个 byte[] buffer 作为缓存,进而复用此 buffer 来消除 GCAlloc。

读取文件时考虑使用读取文件片段方法

对于数据表、本地化字典表这类文本或二进制数据,在实际应用的多数情形下,将全部内容加载到内存中是非常浪费的,对于这类数据不妨在使用某条数据时再去读取这条数据,即所谓的懒加载或者延迟加载。通过合理构造数据结构并利用文件系统能够读取文件片段的特性,即可做到这一点。

例如,先读取字典表的全部 key 值,并记录每个 value 值对应的偏移。在需要获取某个 key 的 value 值时,根据已经记录的偏移值利用读取文件片段的方法实时加载 value 值并缓存。

扩充文件系统的使用场景

Game Framework 提供的文件系统模块是开放的,适用于对任何资源进行组织和管理,而不仅限于 Game Framework 内部使用,故可以考虑将文件系统模块应用在游戏的很多情形下。

例如,在制作玩家聊天自定义表情(玩家可以自行上传表情图片并通过聊天频道发送给其他玩家)的时候,可以考虑将玩家上传和下载的自定义表情图片存储于一个由游戏逻辑创建并管理的 CustomEmotions 文件系统中,而不是将这些图片散放于磁盘上,这样将很好的提升磁盘 IO 性能并能一定程度上提升安全性。

常见问题

文件系统能在哪些平台和目录下使用

文件系统在 Windows、Mac、iOS、Android 平台下均可使用,也同时兼容在各平台的 StreamingAssets 和 PersistentDataPath 目录下使用。但需要注意的是,当文件系统存储于 StreamingAssets 目录下时,访问方式需要始终为 Read,因为此目录下的资源始终是只读的。

用于更新的资源如何使用文件系统

资源管理已经集成文件系统,如果想让资源存放于文件系统,只需要在构建配置 ResourceCollection.xml 中,对应的资源 Resource 标签下指定 FileSystem 属性即可。构建资源时,会自动将此 Resource 放入指定的文件系统,运行时加载资源时,也会自动去对应的文件系统进行加载。

文件系统 - 第1张  | Game Framework