素材数据库组成原理
组成原理
本素材库由类型系统和标签系统组成,依赖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/