gltf模型批量压缩
const gltfPipeline = require("gltf-pipeline");
const fs = require("fs");
const fsExtra = require("fs-extra");
const files = fs.readdirSync('./')
const taskArr = [] // 模型压缩任务
const statArr = [] // 信息统计
files.forEach((fileName) => {
const extname = fileName.replace(/.+\./,"");
const fileNameNoExt = fileName.replace(/(.*\/)*([^.]+).*/ig,"$2");
if(extname == 'gltf'){
statArr.push(fs.statSync(fileName))
const options = {
dracoOptions: {
compressionLevel: 10,
},
};
taskArr.push(new Promise((resolve,reject) => {
console.log(`${fileNameNoExt}.gltf------模型开始压缩。。。`)
return fsExtra.readJson(fileName).then((gltf) => {
return gltfPipeline.processGltf(gltf, options).then(function (res) {
console.log(`${fileNameNoExt}.gltf------模型压缩完成`)
resolve({
res: res,
name: fileNameNoExt,
})
});
});
}))
}
})
Promise.all(taskArr).then((minifiedModelArr) => {
minifiedModelArr.forEach((model) => {
console.log(`${model.name}.min.gltf------文件写入中。。。`)
fsExtra.writeJsonSync(`${model.name}.min.gltf`, model.res.gltf);
console.log(`${model.name}.min.gltf------文件写入完成`)
})
let initTotalSize = 0
let afterTotalSize = 0
statArr.forEach(item => initTotalSize += item.size)
const files = fs.readdirSync('./')
files.forEach((fileName) => {
if(fileName.endsWith('.min.gltf')){
afterTotalSize += fs.statSync(fileName).size
}
})
console.log(`模型压缩完成(共${taskArr.length}个),\n原始总大小:${initTotalSize/1024/1024}Mb,\n压缩后总大小:${afterTotalSize/1024/1024}Mb`)
})