多种字体大小的 FreeType 字形指标缓存
FreeType Glyph Metrics Caching of multiple Font sizes
情况:
我有一个项目可以将产品信息渲染到给定模板(自定义 XML 格式),然后以自定义二进制 LCD 格式渲染和转换它(简化步骤)
我们的客户现在想要自动调整文本 容器。 (客户提供了一个 特定尺寸的盒子 并且所有类型的 字符串都必须自动调整大小 以 适合该容器
为此,我必须为多种字体大小(例如 100pt 不适合,99pt 不适合,98pt 不适合...,... , 65pt 适合!)
问题:
问题是 freetype 为每个自动调整元素花费大量时间(~20-30 毫秒),而我只有~100 毫秒供我的整个应用程序使用。 (所以当客户再添加 5 个自动调整元素时,它已经保证超过 ~100 毫秒)
尝试次数:
一个自制的字体缓存生成器,它获取字体文件并计算从 1pt 到 100pt 的字体大小的每个 unicode 字符的宽度。然后它从数据中生成 C 源代码,如下所示:
//
#define COUNT_SIZES 100 // Font-Size 1-100
#define COUNT_CHARS 65536 // Full Unicode Table
int char_sizes[COUNT_SIZES][COUNT_CHARS] =
{
{1,1,2,2,3,1,1,2,2,3,1,2,2,1,2,2,3,1,2,.......// 65536
{2,2,3,3,4,2,1,3,3,4,2,3,3,2,3,3,4,2,3,.......// 65536
{2,3,4,3,5,2,2,4,4,5,2,4,4,2,4,3,5,3,3,.......// 65536
// ...
// 100 font sizes
};
在动态库 (.so) 中编译的文件大小为 25 MB,"dlload" 需要约 50 毫秒,"dlsym" 需要约 10 毫秒(WAAAAAAY 太多了!)
同样的方法,但只有 ASCII table(所以只有 65536 中的 128 个)编译成一个 58 KB 的 .so 文件,"dlload" 需要 ~500µs,"dlsym" 需要 ~100µs (非常好!)
我的下一次尝试是将 font-cache-generator 集成到我的项目中,并仅缓存特定客户所需的字形(欧洲客户需要约 500 个字形,亚洲(例如繁体中文)需要一个字形) ~2500(仅示例,不确定,可能更需要)
但在我开始艰苦的工作之旅之前 (:() 我想问你是否知道更好的方法?library/project 就可以做到这一点?
我不敢相信这是不可能的,否则浏览器应该如何在不加载秒数的情况下显示 lorem ipsum? :D
知道如何解决这个性能问题吗?
任何有关数据缓存的信息 link 以及对缓存的极快访问(略微 <1 毫秒)?
系统信息:
- Unix (Ubuntu 16.04) 64 位
- x86 AND arm 架构存在!
我找到了一种使用这些库的可能方法:
- ICU(对于 unicode)
- Freetype(对于字形)
- Harfbuzz(用于布局)
Github 项目:
Harfbuzz-ICU-Freetype
宽松的构建说明:
- CMakeLists.txt
option(WITH_XX "DESCRIPT." ON/OFF)
中的搜索选项
- 使用
-D
启用 CMake
选项:cmake -DWITH_ZLIB=ON -DWITH_Harfbuzz=ON ..
mkdir build && cd build && cmake [option [option [...]]] ..
make -j $count_of_cpu_cores && sudo make install
Google 一些 Harfbuzz 布局教程/指南
情况:
我有一个项目可以将产品信息渲染到给定模板(自定义 XML 格式),然后以自定义二进制 LCD 格式渲染和转换它(简化步骤)
我们的客户现在想要自动调整文本 容器。 (客户提供了一个 特定尺寸的盒子 并且所有类型的 字符串都必须自动调整大小 以 适合该容器
为此,我必须为多种字体大小(例如 100pt 不适合,99pt 不适合,98pt 不适合...,... , 65pt 适合!)
问题:
问题是 freetype 为每个自动调整元素花费大量时间(~20-30 毫秒),而我只有~100 毫秒供我的整个应用程序使用。 (所以当客户再添加 5 个自动调整元素时,它已经保证超过 ~100 毫秒)
尝试次数:
一个自制的字体缓存生成器,它获取字体文件并计算从 1pt 到 100pt 的字体大小的每个 unicode 字符的宽度。然后它从数据中生成 C 源代码,如下所示:
//
#define COUNT_SIZES 100 // Font-Size 1-100
#define COUNT_CHARS 65536 // Full Unicode Table
int char_sizes[COUNT_SIZES][COUNT_CHARS] =
{
{1,1,2,2,3,1,1,2,2,3,1,2,2,1,2,2,3,1,2,.......// 65536
{2,2,3,3,4,2,1,3,3,4,2,3,3,2,3,3,4,2,3,.......// 65536
{2,3,4,3,5,2,2,4,4,5,2,4,4,2,4,3,5,3,3,.......// 65536
// ...
// 100 font sizes
};
在动态库 (.so) 中编译的文件大小为 25 MB,"dlload" 需要约 50 毫秒,"dlsym" 需要约 10 毫秒(WAAAAAAY 太多了!)
同样的方法,但只有 ASCII table(所以只有 65536 中的 128 个)编译成一个 58 KB 的 .so 文件,"dlload" 需要 ~500µs,"dlsym" 需要 ~100µs (非常好!)
我的下一次尝试是将 font-cache-generator 集成到我的项目中,并仅缓存特定客户所需的字形(欧洲客户需要约 500 个字形,亚洲(例如繁体中文)需要一个字形) ~2500(仅示例,不确定,可能更需要)
但在我开始艰苦的工作之旅之前 (:() 我想问你是否知道更好的方法?library/project 就可以做到这一点?
我不敢相信这是不可能的,否则浏览器应该如何在不加载秒数的情况下显示 lorem ipsum? :D
知道如何解决这个性能问题吗?
任何有关数据缓存的信息 link 以及对缓存的极快访问(略微 <1 毫秒)?
系统信息:
- Unix (Ubuntu 16.04) 64 位
- x86 AND arm 架构存在!
我找到了一种使用这些库的可能方法:
- ICU(对于 unicode)
- Freetype(对于字形)
- Harfbuzz(用于布局)
Github 项目: Harfbuzz-ICU-Freetype
宽松的构建说明:
- CMakeLists.txt
option(WITH_XX "DESCRIPT." ON/OFF)
中的搜索选项
- 使用
-D
启用CMake
选项:cmake -DWITH_ZLIB=ON -DWITH_Harfbuzz=ON ..
mkdir build && cd build && cmake [option [option [...]]] ..
make -j $count_of_cpu_cores && sudo make install
Google 一些 Harfbuzz 布局教程/指南