游戏开发过程中经常会碰到美术给的ttf字体太大,他们又不会压缩和裁剪,而我们客户端对资源的大小非常敏感。尤其是发布小游戏的时候,一个ttf大小10M 你敢想象?
为此我开发了一个小小的工具,专门处理这种问题
giteed地址:gitee地址
就一个简单的js脚本,希望能帮到需要的人
const fs = require('fs');
const Fontmin = require('fontmin');
const path = require('path');
//输入目录,支持多个
const inputdir = "font"
//输出目录
const outputdir = "out"
//保留的字符目录, 支持多个txt文件
const includeddir = "included"
function start() {
//递归查找所有待瘦身的ttf字体
let ttfs = findFileSync(inputdir, '.ttf');
//递归查找所有配置的保留字符
let included_texts = findFileSync(includeddir, '.txt');
//合并字符
let chars = "";
included_texts.forEach(file => {
const str = fs.readFileSync(file, 'utf-8');
chars += str;
});
//开始处理ttf字体
for (let i = 0; i < ttfs.length; i++) {
let f_name = path.basename(ttfs[i])
new Fontmin()
.src(ttfs[i])
.use(Fontmin.glyph({ text: chars })) // 子集化字体
.dest(outputdir)
.run((err,files)=>{
if(err == null){
console.log("success = > " + f_name)
}else{
console.error(err);
}
})
}
}
start();
function findFileSync(directoryPath, suffix) {
const _files = [];
try {
const files = fs.readdirSync(directoryPath);
files.forEach(file => {
const filePath = path.join(directoryPath, file);
const stats = fs.statSync(filePath);
if (stats.isFile() && path.extname(filePath).toLowerCase() === suffix) {
_files.push(filePath);
} else if (stats.isDirectory()) {
const subTTFFiles = findFileSync(filePath, suffix);
_files.push(...subTTFFiles);
}
});
} catch (error) {
console.error('Error reading directory:', error);
}
return _files;
}
运行环境准备:
1.安装node
2.安装node库, fs,fontmin,path
3.运行 node ./handler.js 即可
注意:
1.需要保留的字符以txt的形式放在 included文件夹中即可。这里我在网上找了3000个常用的中文汉字和字母数字常用符号等。希望压缩的更小的话可以自行配置
如果帮到你了,辛苦点个赞