|
|
发表于 2006-2-18 00:36:16
|
显示全部楼层
Post by ifree
使用Wine事,我用utf8的locale,如果运行了SCIM的话,启动Wine,菜单,对话框等都慢得要死,而pkill scim后就正常了。如果一定要运行scim的话,使用LC_ALL=zh_CN.GBK又没有什么问题。
按照这里所说:
http://hzhr.blogeden.cn/post/30874/3943
是因为缺乏gbk字体,但是我运行 xlsfonts | grep gbk得到
-misc-simhei-medium-r-normal--0-0-0-0-c-0-gbk-0
-misc-simsun-medium-r-normal--0-0-0-0-c-0-gbk-0
这表明我是有gbk字体的吧?可是问题依然如故。
一个意外的机会我运行:
xfontsel
发现cpu占用马上100%一段时间后才能弹出对话框,
而用 LC_ALL=zh_CN.GBK xfontsel
立刻就弹出对话框了。
所以我大胆猜测是不是xfontsel造成wine等使用了XFontSet的程序弹出对话框其慢无比呢?
如果是这样,有什么解决办法吗?
我再说明一下,-*-gbk-0 只是我举的一个例子,考虑到大部分人是 zh_CN.GBK 或 zh_CN.UTF-8 locale。并不是说有了 -*-gbk-0 字体,Wine 就没有这个问题了,可能原先我没有说清楚,造成了一些理解上的不对。
先说一下这个问题的原因,不是 locale 也不是输入法的问题,问题原因就是在于 Wine 的那一段代码:
- fontSet = XCreateFontSet(display,
- "*", /*FIXME*/
- &missing_fonts, &count, NULL);
复制代码
如果了解 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 字符集的字体。
我附带一个测试程序,可以查看在当前 locale 下,XServer缺了哪些字符集的字体。在不同locale下试试看,下面是在我机器上的输出:
- 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
复制代码
如上,在 zh_CN.GB18030 和 zh_HK.big5hkscs 下,这个程序运行的时间明显偏久,因为我的系统缺了 GB18030-0 和 BIG5HKSCS-0 的字体。所以你可以查看一下,在 zh_CN.UTF-8 下,你的系统缺了哪些字体?
另外需要说明的是,XCreateFontSet使用"*"来创建字体,本来就是很慢的,所以即使你的当前locale下不缺字体,这个查找也可能是很费时间的,所以不要抱怨为什么字体不缺,还是这么慢。
要解决这个问题,没有什么好的办法,给 Wine 打补丁可以,但是补丁不好写,要用什么匹配条件来替换 "*" 呢,没有一个固定的完美的匹配条件能适合所有locale,所以 gtk+ 1.0 的做法是,读配置文件 /etc/gtk/gtkrc.*,XFontSet是过时的东西,Wine 不会接受这样的补丁;或者Wine可以去掉支持OverTheSpot的XIM输入风格,因为目前看只有OverTheSpot输入风格要求XFontSet。当然最简单的办法,缺啥补啥。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|