我有一个项目将产品信息呈现到给定模板(自定义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)?
答案 0 :(得分:1)
我找到了一种使用这些库的可能方法:
Github项目: Harfbuzz-ICU-Freetype
松散的构建说明:
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布局教程/指南