每次定制中文系統時,NK總是比英文大10M左右,啟動時在bootloader中將內核Copy到內存時也花時間,同時也占用了很多內存,留給系統和應用的內存就少了10M左右,真是浪費呀,看到都心痛!本人研究了一下,同時也參考了網上的資料,現總結如下,如何減少中文字庫大小和將字庫放到外部存貯器上。核心思想是將默認選擇的中文字體SimSun & NSimSun (SYSGEN_FONTS_SIMSUN)替換成SimSun & NSimSun (Subset 2_50) (SYSGEN_FONTS_SIMSUN_2_50)達到體積的縮小。在注冊表中[HKEY_LOCAL_MACHINE\SOFTWARE \Microsoft\FontPath]和[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\FontLink \SystemLink]改變字庫simsun.ac3或simsun.ttc的存貯位置。 一、減少中文字庫大小 1.先打開目標的工程文件,單擊“Platform”菜單,再單擊“Settings…”,執行”clear” , Locales:將”英文(美國)”“中文(中國)”打勾 Default languare:選擇“中文(中國)” 完成第1步后,工程中采用默認的是新宋字體 2,回到Catalog,選擇“Core OS”—>“International”—>“Locale Spectific Support” —> “Chinese[Simplified]” ▲ Agfa AC3 Font Compression:使用AC3對字庫進行壓縮,若CPU有300HZ以上,建議選上;這個可以根據自己的需要選還是不選. ▲ SimSun & NSimSun (Subset 2_50):字體大小是3M左右,WINCE選擇Subset 2_50是最合適的,所以用(Subset 2_50)中文字體替換原來的中文字體,選擇SimSun & NSimSun (Subset 2_50),按右鍵添加該組件即可,這樣就會把原來的字體替換掉。這樣對中文顯示又沒有影響又達到內核瘦身的效果。必須選上; 補充:在沒有壓縮字體的情況來,默認選擇的新宋字庫大小是10M多,文件為simsun.ttc,若選擇Subset 2_50版本,文件為simsun_2_50.ttc,字體大小是將近3M,也是對WinCE體積進行裁剪關鍵所在。當然如果選擇了AC3對字庫進行壓縮,哪么體積還可以進一步縮小,壓縮后的文件為simsun_2_50.ac3,體積就只有不到2M。 字庫所在目錄:D:\WINCE500\PUBLIC\COMMON\OAK\FILES ▲ GB18030 Data Converter:漢字編碼標準集轉換器,必須選上 3,重新進行Sysgen,這樣做出來的系統,既能正常顯示中文,又不用擔心NK體積過大。 二、將字體保存到外部存貯器上來減少內核的大小 網上有很多介紹將字體保存到SD卡、Flash等來減少內核的大小,但要注意一點就是:在加載顯示驅動前就要加載保存字體的存貯設備的驅動,否則中文字體不能加載,系統啟動后顯示框框。將字體保存到注冊表保存的存貯設備上,因為該存貯設備驅動很早就加載了。 而我使用的是硬盤,注冊表需要作如下修改 1、在platform.reg中添加如下 [HKEY_LOCAL_MACHINE\SYSTEM\GDI] "FontLinkMethods"=dword:1 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\FontPath] "FontPath"="\\Hard Disk" ; 字庫文件所在目錄 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\FontLink\SystemLink] "Tahoma"="\\Hard Disk\\simsun.ac3,NSimSun" ;我是用的壓縮字庫,所以為simsun.ac3。 "Courier New"="\\Hard Disk\\simsun.ac3,NSimSun" "Arial"="\\Hard Disk\\simsun.ac3,NSimSun" "Times New Roman"="\\Hard Disk\\simsun.ac3,NSimSun" "Symbol"="\\Hard Disk\\simsun.ac3,NSimSun" 2、在工程目錄中common.bib文件中刪掉simsun.ac3相關項,確認該文件不會編到內核中。 3、把文件拷到Hard Disk中,即可,再啟動就ok了。 PS: 先翻譯MSDN中關于鏈接字體的解釋: Windows Embedded CE提供了鏈接字庫的能力,它可以將一個或多個字庫鏈接到另一個字庫上,前者稱為被鏈接字庫,后者稱為基本字庫。一旦你鏈接了字庫,你就可以使用被鏈接的字庫顯示在基本字庫中不存在的碼字。比如,將日文字庫鏈接到拉丁字庫,你就可以在使用拉丁字庫的UNICODE文本API中顯示日文字符。 如果你的設備上啟用了字庫鏈接,你可以通過檢查注冊表的子鍵HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\FontLink\SystemLink來確定被鏈接的字庫到基本字庫的映射關系,下面的代碼示例了如何在注冊表中添加一個鏈接: 使用字庫鏈接時,你可以規定一個或多個UNICODE字符必須從被鏈接字體中取,即使這些字符也存在于基本字庫中。要指定被從基本字庫中忽略的字符,你可以使用HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\FontLink\SkipTable注冊表鍵,此鍵在操作系統啟動時是只讀的。 在下面的示例代碼中,某字符的UNICODE編碼為005c,雖然Tahoma字庫中包含此碼字,但仍然只使用被鏈接字庫中的字符。 Tahoma=005c, 00a5, 007e, 0391-03c9, 2026, 2116, 221a, 25a0-25ff 當添加了中文字庫支持時,實際上也就是將中文字庫作為被鏈接字體使用的: [HKEY_LOCAL_MACHINE\SYSTEM\GDI] "FontLinkMethods"=dword:1 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\FontLink\SystemLink] "Tahoma"="\\Windows\\simsun.ac3,NSimSun" "Courier New"="\\Windows\\simsun.ac3,NSimSun" "Arial"="\\Windows\\simsun.ac3,NSimSun" "Times New Roman"="\\Windows\\simsun.ac3,NSimSun" "Symbol"="\\Windows\\simsun.ac3,NSimSun" [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\FontLink\SkipTable] "Tahoma"="005c,00a5,007e,0391-03c9,2026,2116,221a,25a0-25ff" // 0391-03c9 is Greek chars. "Arial"="005c" "Courier New"="005c" |
文章比較深奧。 |
kanbudong |
很好的技術文章! |
不錯,頂起來! |
好資料,分享 |
分享了! |
來看看 謝謝分享 |
杭州立宇泰電子有限公司主營產品:MID、Andorid行業手持終端、車載駕培系統終端、警務通、嵌入式平板電腦、便攜式無線電子菜單、多串口服務器、嵌入式單板電腦、S5PV210/S3C6410/2440/2410/44B0開發板及各種顯示方案等自主知識產權的產品 |
好文章,樓主辛苦了 |