wine慢的原因

Wine、Cedega、CrossOver 等配置
回复
头像
nobrain
帖子: 808
注册时间: 2005-08-25 13:58
来自: ustc
联系:

wine慢的原因

#1

帖子 nobrain » 2006-06-11 14:38

在 linuxsir 上看到 hzhr 的一片帖子,觉得很有道理:
http://www.linuxsir.org/bbs/showthread.php?t=243037
并不是说有了 -*-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。当然最简单的办法,缺啥补啥。
我的理解是,因为缺字体,所以XFontSet这个函数要运行很久,这也就是为什么,打开一个窗口或菜单很慢的原因。如果在打开菜单的时候用用top看cpu使用率的话,会发现Xorg占用了97%以上(注意这里是Xorg占用的CPU时间,而不是wine),我猜应该是因为 XFontSet 在查找字体的缘故,而这个任务是由Xorg完成的。

那个 xfontset (附带的查看却什么字体的程序)我放到附件里了,方便在linuxsir上没帐号的朋友。

我运行时,显示的是:

代码: 全选

ximFontSet = 0x8070fa0, missing_fonts = 0x806f3f0, count = 1
missing_fonts[0] = GBK-0
谁能告诉我怎样加 GBK-0字符集啊 :em70
附件
xfontset.tar.gz
(3.73 KiB) 已下载 156 次
爱喝真猪奶茶的夜鸣猪
Jamsa
帖子: 147
注册时间: 2006-03-17 13:40

#2

帖子 Jamsa » 2006-06-11 17:47

这个贴是精华,我就是按这个贴搞定的。
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

#3

帖子 eexpress » 2006-06-11 18:25

代码: 全选

$ ./xfontset
ximFontSet = 0x8076268, missing_fonts = (nil), count = 0

~/.wine/drive_c/windows/fonts$ l
SimSun-Bold.ttf@  SimSun.ttf@
试试

我觉得还有其他bug的。不光是字体。
● 鸣学
头像
nobrain
帖子: 808
注册时间: 2005-08-25 13:58
来自: ustc
联系:

#4

帖子 nobrain » 2006-06-11 21:20

楼上的朋友,SimSun-Bold.ttf 我这里没有,另外,在扩展名后加"@"的用意是?
爱喝真猪奶茶的夜鸣猪
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

#5

帖子 eexpress » 2006-06-12 0:07

@是表示链接。ln的文件啊。呵呵。我的文件都是这样搞的,自己控制,其他不是自己的目录,都尽量用ln的。
Bold不记得哪里下的。网上有。
● 鸣学
头像
nobrain
帖子: 808
注册时间: 2005-08-25 13:58
来自: ustc
联系:

#6

帖子 nobrain » 2006-06-13 14:33

已经解决了,看本论坛的:

[分享]解决wine启动慢和xorg占有cpu100%的方法。(目前应该是最好的)
viewtopic.php?t=17545
爱喝真猪奶茶的夜鸣猪
回复