簡體   English   中英

FreeType字形指標緩存多種字體

[英]FreeType Glyph Metrics Caching of multiple Font sizes

情況:

我有一個項目,可將產品信息呈現到給定的模板(自定義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

關於如何解決此性能問題的任何想法?

數據高速緩存上是否有信息鏈接,可以極快地訪問高速緩存(大約<1ms)?

系統信息:

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

我發現了使用這些庫的一種可能方法:

  • ICU (用於unicode)
  • 自由類型 (針對字形)
  • Harfbuzz (用於布局)

Github項目: Harfbuzz-ICU-Freetype

寬松的構建說明:

  • CMakeLists.txt option(WITH_XX "DESCRIPT." ON/OFF)搜索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 for Harfbuzz Layout的一些教程/指南

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM