CQ备忘录

一间存放故事的仓库

GitHub LinkedIn
6 July 2020

Tech:游戏引擎为何不用数据库?

by ChenQi

问题

游戏引擎为何不使用数据库来管理资源文件?

游戏引擎的资源管理一直是挺麻烦的一件事情,那为什么各个引擎都不使用sqlite这种关系型数据库来管理资源呢?

回答

  1. 数据库并不一定等于高性能。
  2. 关系型数据库的优势在于关系型关联数据的碎片小数据,高频,并发,读写场景。游戏资源一般关系结构比较松散。
  3. 游戏资源文件一般是只读的,不需要写操作。
  4. 游戏资源文件一般不涉及像数据库多表索引join的存储和查询结构。
  5. 游戏引擎以前还需要支持光盘存储。这个只有顺序块读取才能高效。

所以用自定义文件格式实现没毛病。

可参考 UnrealEngine 的资源文件管理实现部分,代码量不算多,看的过来。
通常发布时(Cooked)资源都是被整合压缩过的,但是不要把整个大文件压缩存储,这样读慢。而是小文件分块压缩,构造成一个格式上无压缩的大文件。这样整个文件支持索引,并且小文件内存解压很快,还可以支持多核CPU并行解压。单个大文件解压一般只能单核顺序,造成瓶颈。
多表查询确实有需求场景,目前引擎的方式是路径仅是一个索引,通过这个路径拿到资源的MD5值,在通过MD5值找到唯一的那个资源,以预防同样的资源存在多份的情况。绝大多数情况下,内存索引都比磁盘索引更快。只是代码量可能多写点。
UnrealEngine 这部分代码初读时会困惑于它的实现太绕了,但是看到支持XBox和PlayStation部分就懂了,为了支持光盘顺序读取,以便加速一个大型3D场景所需的多种资源时,这样实现是必要的。

另外一个更专业角度的回答

tags: