http://www.linuxsir.org/bbs/showthread.php?t=243037
我的理解是,因为缺字体,所以XFontSet这个函数要运行很久,这也就是为什么,打开一个窗口或菜单很慢的原因。如果在打开菜单的时候用用top看cpu使用率的话,会发现Xorg占用了97%以上(注意这里是Xorg占用的CPU时间,而不是wine),我猜应该是因为 XFontSet 在查找字体的缘故,而这个任务是由Xorg完成的。并不是说有了 -*-gbk-0 字体,Wine 就没有这个问题了,可能原先我没有说清楚,造成了一些理解上的不对。
先说一下这个问题的原因,不是 locale 也不是输入法的问题,问题原因就是在于 Wine 的那一段代码:
代码:
如果了解 XFontSet,那就知道那段代码是干什么的,简单的说,就是根据匹配条件,创建出一个适合当前locale的XFontSet。怎么样的 XFontSet才是“适合”的呢,如果安装了 gtk+ 1.0,可以查看 /etc/gtk/gtkrc.*,可以看到不同的 locale 对 XFontSet 的要求是不一样的,当然你也可以查看 /usr/X11R6/lib/X11/locale/*/XLC_LOCALE,里面详细的描叙了创建 XFontSet 的规则。例如,在我的机器上,Xorg 6.9.0,zh_CN.GBK下,创建成功的 XFontSet 包含有 ISO8859-1 和 GBK-0 字符集的字体。代码: 全选
fontSet = XCreateFontSet(display, "*", /*FIXME*/ &missing_fonts, &count, NULL);
我附带一个测试程序,可以查看在当前 locale 下,XServer缺了哪些字符集的字体。在不同locale下试试看,下面是在我机器上的输出:
代码:如上,在 zh_CN.GB18030 和 zh_HK.big5hkscs 下,这个程序运行的时间明显偏久,因为我的系统缺了 GB18030-0 和 BIG5HKSCS-0 的字体。所以你可以查看一下,在 zh_CN.UTF-8 下,你的系统缺了哪些字体?代码: 全选
hzhr@debian:~/test$ LANG=zh_CN.GB2312 time ./xfontset ximFontSet = 0x80550e0, missing_fonts = (nil), count = 0 0.00user 0.00system 0:00.07elapsed 11%CPU (0avgtext+0avgdata 0maxresident)k 0inputs+0outputs (0major+342minor)pagefaults 0swaps hzhr@debian:~/test$ LANG=zh_CN.GBK time ./xfontset ximFontSet = 0x8054158, missing_fonts = (nil), count = 0 0.00user 0.00system 0:00.05elapsed 20%CPU (0avgtext+0avgdata 0maxresident)k 0inputs+0outputs (0major+346minor)pagefaults 0swaps hzhr@debian:~/test$ LANG=zh_CN.GB18030 time ./xfontset ximFontSet = 0x8055df0, missing_fonts = 0x80541f0, count = 1 missing_fonts[0] = GB18030-0 0.00user 0.00system 0:07.42elapsed 0%CPU (0avgtext+0avgdata 0maxresident)k 0inputs+0outputs (0major+292minor)pagefaults 0swaps hzhr@debian:~/test$ LANG=zh_TW.BIG5 time ./xfontset ximFontSet = 0x8056230, missing_fonts = (nil), count = 0 0.01user 0.00system 0:00.05elapsed 37%CPU (0avgtext+0avgdata 0maxresident)k 0inputs+0outputs (0major+349minor)pagefaults 0swaps hzhr@debian:~/test$ LANG=zh_HK.big5hkscs time ./xfontset ximFontSet = 0x80541f0, missing_fonts = 0x80541e0, count = 1 missing_fonts[0] = BIG5HKSCS-0 0.00user 0.00system 0:07.37elapsed 0%CPU (0avgtext+0avgdata 0maxresident)k 0inputs+0outputs (0major+301minor)pagefaults 0swaps
另外需要说明的是,XCreateFontSet使用"*"来创建字体,本来就是很慢的,所以即使你的当前locale下不缺字体,这个查找也可能是很费时间的,所以不要抱怨为什么字体不缺,还是这么慢。
要解决这个问题,没有什么好的办法,给 Wine 打补丁可以,但是补丁不好写,要用什么匹配条件来替换 "*" 呢,没有一个固定的完美的匹配条件能适合所有locale,所以 gtk+ 1.0 的做法是,读配置文件 /etc/gtk/gtkrc.*,XFontSet是过时的东西,Wine 不会接受这样的补丁;或者Wine可以去掉支持OverTheSpot的XIM输入风格,因为目前看只有OverTheSpot输入风格要求 XFontSet。当然最简单的办法,缺啥补啥。
那个 xfontset (附带的查看却什么字体的程序)我放到附件里了,方便在linuxsir上没帐号的朋友。
我运行时,显示的是:
代码: 全选
ximFontSet = 0x8070fa0, missing_fonts = 0x806f3f0, count = 1
missing_fonts[0] = GBK-0