【问题标题】:FreeType Glyph Metrics Caching of multiple Font sizesFreeType Glyph Metrics 缓存多种字体大小
【发布时间】:2017-05-18 17:00:27
【问题描述】:

情况:

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

我们的客户现在需要自动调整文本容器。 (客户给了一个特定大小的盒子,所有类型的字符串都必须自动调整大小适合该容器

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

问题:

问题是 freetype 每个自动调整元素都需要很长时间(~20-30 ms),而我的整个应用程序只有~100ms 可以使用。 (所以当客户再添加 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 表(因此只有 65536 个中的 128 个)编译成 58 KB 的 .so 文件,“dlload”需要 ~500µs,“dlsym”需要 ~100µs(非常好!)

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

但在我踏上艰苦的旅程之前 (:() 我想问你是否知道更好的方法?一个图书馆/项目就是这样做的?

我不敢相信这是不可能的,否则浏览器应该如何在不加载秒数的情况下显示 lorem ipsum? :D

你知道如何解决这个性能问题吗?

关于数据缓存的任何信息链接以及对缓存的极快访问(有点

系统信息:

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

【问题讨论】:

    标签: c++ performance unix caching freetype2


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-02
      • 1970-01-01
      • 1970-01-01
      • 2017-04-01
      • 2021-11-23
      • 1970-01-01
      • 2021-07-31
      • 1970-01-01
      相关资源
      最近更新 更多