情况:

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

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

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

问题:

问题是,对于每个自动调整元素,freetype需要花费大量时间(〜20-30 ms),而整个应用程序只能使用〜100ms。 (因此,当客户再添加5个自动调整元素时,已经保证超过100毫秒)

尝试次数:

一个自制的font-cache-generator,它生成一个字体文件,并为从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”需要约50ms,“ dlsym”需要约10ms(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)64位
x86和arm架构存在!

最佳答案

我发现了使用这些库的一种可能方法:


ICU(用于unicode)
自由类型(针对字形)
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


Google for Harfbuzz Layout的一些教程/指南

关于c++ - FreeType字形指标缓存多种字体,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41228395/

10-11 18:02