1. 素材数据库组成原理

  2. 组成原理

  3. 类型系统

  4. 顶级分类

  5. 多级分类

  6. 组合索引

  7. 文件

  8. 可靠属性

  9. 不可靠属性

  10. 派生属性

  11. 图像增强算法

  12. 3D模型

  13. 标签系统

  14. 文件名

  15. 多键索引

  16. 数据表字段

  17. _id

  18. tags

  19. class_N

  20. size

  21. 缩略图

  22. 引用

素材数据库组成原理

组成原理

本素材库由类型系统和标签系统组成,依赖fileSystem和mongodb这2个存储介质,同时需要nodejs和web进运算行处理与展示集成。本素材库希望利用fileSystem存储所有素材,利用mongoDB存储素材的索引,从而实现Everything这样的搜索引擎。

类型:一对多的树形分类

标签:多对多的索引

FS:文件系统,用于存储素材

mongodb:蒙古数据库,用于存储索引

nodejs:后端

web:前端

类型系统

顶级分类

顶级分类指不同的数据表,每个数据表对应一个根文件夹,表名==文件夹名,比如可以分为下面几类:

图片:图片文件

特效:shader代码(glsl或hlsl)

模型:Draco压缩后的3d模型(gltf或fbx)

多级分类

多级分类对应数据表中的class字段,也对应文件夹的路径:

建筑/民房

交通工具/地面载具/货车

组合索引

文件

文件系统FS中的文件可以自定义许多属性,这里给他们分3类:

可靠属性:始终不变的字段

不可靠属性:跨FS拷贝时可被随意修改

派生属性:不占空间,根据其他属性临时计算得出

可靠属性

路径:尽量全用英文

文件名:大小写尽量统一

大小:文件真实体积

内容:文件的内容

不可靠属性

权限

增改查日期

标签、备注、作者、版本:这些我从没用过。。

打开方式

派生属性

大小:文件体积

种类:根据文件后缀名/魔数/释伴(shebang)判断得出

图标/预览:根据种类而定

隐藏:根据后缀名前是否有字符而定

媒体信息:如图像分辨率、音视频的时长等

因此素材库只能依赖FS的可靠属性,充其量再存储一下创建日期,其余的功能都放在mongodb数据库中实现

图像增强算法

根据经验,素材库中占大头的部分一定是图片文件,尤其是一张4K以上的高清图基本上是10m起步,这样存不了几张就占满了磁盘空间。为此可以使用图像增强算法,从缩略图重建高清图像,在用户点击下载原始图像的时候,临时伪造一个原图。毕竟素材讲究应景即可,不必非常真实。

对比度增强:调整过暗或者过亮图像的对比度,使图像更加鲜明

无损放大:将图像在长宽方向各放大两倍,保持图像质量无损

图像修复:支持去除图片中不需要的遮挡物,使用背景内容进行填充;修复图片缺损内容

清晰度增强:对压缩后的模糊图像实现智能快速去噪,优化图像纹理细节,使画面更加自然清晰

色彩增强:可智能调节图片的色彩饱和度、亮度、对比度,使得图片内容细节、色彩更加逼真

3D模型

为了存储巨量的模型,单个模型的体积要足够小,3D模型中的PBR材质里尽量不要存在贴图,同时利用Draco压缩几何信息。

标签系统

文件名

为了能够自动化导入标签,文件的命名规范应当是下划线分隔的标签列表,例如:

建筑_公寓_办公楼.glb

写字楼_建筑_摩天大厦.fbx

多键索引

索引是数据库最常见的优化方法,通常的索引都是单键索引,即键值对是一对多的关系,但mongodb推出了多键索引(multikey index),即键值对是多对多的关系,这非常适合列表类型的字段tags。tags列存储素材的标签,每个标签名尽量简短,数量可以尽可能的多,可以将原始名称存入tags。

数据表字段

类型

索引

 

_id

 Integer

 唯一

 文件创建日期

tags

 List

 多键

 素材的标签

class_N

 String

 组合

 素材所在文件夹的绝对路径

size

 Integer

 单键

 文件大小,单位字节

pre

 String

 单键

 文件名前缀

suf

 String

 单键

 文件名后缀

_id

_id是mongodb的默认主键,不可删除,所以让它存储素材的不可靠属性之创建日期。

tags

tags是最重要的字段,是搜索引擎的主要检索字段,标签与素材是多对多的关系,需要应用mongodb的多键索引,通过标签来寻找素材非常方便。

class_N

class_N指素材的类型,N从0开始递增,因此class_N代表多个字段,多个字段按顺序做组合索引。类型与素材是一对多的关系(文件夹与文件),但类型与类型之间还拥有层级关系,这种层级关系和文件夹路径完全同步。多级分类的设计要比标签更谨慎,因为分类不易修改。

size

素材的大小,通过体积范围来检索素材也很常用。

缩略图

图片素材,3D模型和特效材质都可以分配一个缩略图以供预览。缩略图和素材一一对应,但素材可以没有缩略图,缩略图的命名格式是在素材文件名前加点号,即“隐藏文件”。缩略图文件不参与mongodb的索引。

引用

Everything引擎:https://en.wikipedia.org/wiki/Everything_(software)

百度的图像增强算法:https://cloud.baidu.com/product/imageprocess/enhancement

Mongo多键索引:https://docs.mongodb.com/manual/core/index-multikey

Draco无损压缩:https://google.github.io/draco/