多种字体大小的 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 毫秒)?

系统信息:

我找到了一种使用这些库的可能方法:

  • ICU(对于 unicode)
  • Freetype(对于字形)
  • Harfbuzz(用于布局)

Github 项目: Harfbuzz-ICU-Freetype

宽松的构建说明:

  • CMakeLists.txtoption(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 布局教程/指南