在Windows中,GTK+(GTKSharp)性能较差

5
在我的跨平台Mono(C#)项目中,我正在使用GTK作为UI。但是,我注意到一件事情,在我的Archlinux上的netbook上,性能非常快,因此鼠标悬停和小部件的重绘等事件非常快。
与双核CPU上的Windows(7)相比,性能真的很弱。这让我感到困惑。
我是否做错了什么导致OS之间的性能差异?
有什么方法可以优化Windows上的GTK?当悬停事件需要大约0.5秒才会触发时,这真的很糟糕,而在Linux上的较弱的netbook上几乎是立即的。
这是我的GUI层代码:http://code.google.com/p/subsynct/source/browse/branches/dev/subsync#subsync/GUI 谢谢!
2个回答

8
真正的问题在于GTK使用的图形库Cairo。你说得对,与Windows相比,GTK在Linux和其他操作系统上表现更好。这表明问题实际上并不是整个Cairo库的问题。它在Cairo的Win32后端中。根据Cairo文档中的Backend-Info,Cairo使用xlib,在某些情况下使用cairo-gl(考虑到定制的OpenGL)在Linux和其他平台上工作。而在Windows上,它使用Win32 GDI,毕竟有点慢而且过时(更不用说完全是软件渲染)。

然而,即使如此也不能完全解释Gtk在Windows上的性能不佳。另一个问题可能是,Gtk更喜欢使用自己绘制的小部件(链接1),这些小部件在所有平台上看起来几乎相同。但是,在Windows上,它还尝试使用LibWimp模拟本地小部件以进一步增强本地外观和感觉(链接2)。这个额外的仅适用于Windows的步骤可能也会导致性能开销。要亲自查看,请尝试删除(或重命名)GIMP目录中的libwimp.dll。之后,GIMP运行速度会快得多(虽然看起来有点不本地化)。

还有其他一些较小的因素可能会影响Gtk在Windows上的性能,例如GTK比其他工具包多了一个运行时和大约12-15个额外的dll。动态链接整个Gtk运行时可能会大大增加启动时间。此外,Gtk使用了许多其他库,如GlibPango和当然还有Cairo。为这些库编写粘合代码也会增加很多开销,并且有时甚至需要额外的库,比如Gdk

为了优化Gtk,您可以尝试更改Cairo的后端(困难,不推荐且需要另外大量的粘合代码),或停止使用libWimp(这将使Gtk看起来不那么本地)。但总体而言,我认为GTK并不是那么慢。我个人从未需要使用任何优化。即使我过去也使用过WinApi。

2
我猜测性能问题出现在Cairo上。我建议您在Linux中使用gtkparasite来查看应用程序的哪些部分何时进行重绘,并进行优化。
您还可以在Windows上使用免费的CLR Profiler从MS中找到应用程序的热点。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接