FreeType字形指标缓存多种字体大小

时间:2016-12-19 17:57:04

标签: c++ performance unix caching freetype2

情况:

我有一个项目将产品信息呈现到给定模板(自定义XML格式),然后以自定义二进制LCD格式呈现和转换(简化步骤)

我们的客户现在需要自动调整文本容器。 (客户提供特定尺寸的框,各种字符串必须自动调整大小 适合该容器

为此我必须计算多个字体大小的字符串宽度(freetype:每个字符/字形)(例如100pt不合适,99pt不合适,98pt不......,...,65pt适合! )

问题:

问题是freetype每个自动调整元素需要花费很多时间(~20-30 ms),我的整个应用程序只需要~100ms。 (所以当客户增加5个自动调整元素时,它已经保证超过~100毫秒)

尝试:

自制字体缓存生成器,它获取字体文件并计算每个unicode字符的宽度,用于从1pt到100pt的字体大小。然后它从数据中生成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”需要大约50ms,“dlsym”大约需要10ms(WAAAAAAY太多了!)

同样的方式,但只有ASCII表(因此只有12836的128)编译成58 KB .so文件,“dlload”需要~500μs,“dlsym”需要~100μs(非常好!)

我的下一次尝试是将font-cache-generator集成到我的项目中,并仅缓存特定客户所需的字形(欧洲客户需要~500个字形,一个在亚洲(例如繁体中文)需要~2500 (只有例子,不完全确定,甚至可能更需要)

但是在我开始艰苦的工作之前(:()我想问你是否知道更好的方法吗?一个图书馆/项目就是这样做的吗?

我无法相信这是不可能的,浏览器如何在没有加载秒的情况下显示lorem ipsum呢? :d

有关如何解决此性能问题的想法吗?

有关数据缓存的任何信息链接,可以极快地访问缓存(有点<1ms)?

系统信息:

  • Unix (Ubuntu 16.04) 64位
  • x86 arm 架构存在!

1 个答案:

答案 0 :(得分:1)

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

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

Github项目: Harfbuzz-ICU-Freetype

松散的构建说明:

  • CMakeLists.txt option(WITH_XX "DESCRIPT." ON/OFF)
  • 中的搜索选项
  • 使用CMake启用-D个选项:cmake -DWITH_ZLIB=ON -DWITH_Harfbuzz=ON ..
  • mkdir build && cd build && cmake [option [option [...]]] ..
  • make -j $count_of_cpu_cores && sudo make install

谷歌的一些 Harfbuzz布局教程/指南