Tchaikov’s Journal

June 5, 2006

Python, OpenGL 和 Profile

Filed under: Python

平台,平台,演示平台。虽然有一万分的不愿意,我还是耐着性子研究如何画界面。而磁敏曲线的界面天生就没有吸引力。先不管这么多吧,从头开始。为了获得和平台图形界面相同的感官效果,我们就用 WxWidget。为了让开发简单快捷,跨平台,语言就用 Python。哈哈!
WxWidget 画界面应该没有问题。但是我们这里有两个难关。

  • 动态的磁敏波形
  • 以后可能加入的同步视频演示窗口
对 wxWidget 比较熟悉的朋友应该立即能找到对应的模块,前者是 wx.lib.plot 或者重量级的 matplotlib。后者则是 wx.media 或者 pymedia。接下来把它们简单比较一下。 先说 matplotlib。不久之前,我对 matplotlib 做过测试,显示效果虽然不错,但是 FPS 很低。用 GTK+ 前端的话,只有 40fps,而且 CPU 占用率达到了 100%。如果要平滑地显示磁敏曲线,这样的性能明显是不可接受的。wx.lib.plot 是 wxPython 的嫡系正宗,但是很久没有更新了,而且它的绘图方式应该是用操作系统的 GDI,想来速度不会很好。回头再测试一下。 在搜索相关资料的时候,我发现有人 和我有相同的问题,不过时间已经是 6 年之前了。thread 的主人原来的程序是使用 Tkinter 的,他希望能在1/10秒里画1000条线,但是在他的P166机器上速度太慢了。thread 里有人做了实验,用 Windows NT, P200, 64M 的机器,使 wxPython 跑出了 0.18s 画 1000 条线的成绩。这位仁兄同时还建议试试 OpenGL 和双缓存的方法,以提高速度。还是在这个帖子里。也有人建议楼主用 Canvas.coords 来移动线条,然后再 redraw 这些线。值得注意的是 Guido 叔叔也参与了讨论,他的方法是绕过 Python 的 Tkinter 绑定,直接用 Tcl 的语法调用 <widget>.tk.call(…), Guido 发现这样能让速度提升一个层次。也有人用 OpenGL 和 NumPy获得了每帧几百条线的成绩,但是不知道他每秒能有多少帧? 看完这个 thread,我立即试了一下 PyOpenGL。glut* 函数相当好用,只要在 glutIdleFunc 注册的函数里更新坐标就可以画出动画。没有几分钟我就凑出来个蠕动的 sine 曲线。但是问题在于 sine 曲线运动得太快了,刷新频率太高,同时 CPU 的使用率也是满档。然后把更新坐标的函数改成注册到 glutTimerFunc,就好了大半。接下来就是每秒多少帧和帧间移动多少的权衡了。总体效果还过得去,CPU占用率也很小。 wx.media 自己是无法完成解码的工作的。它借助平台相关的后端进行不同格式媒体文件的解读。Windows 上,后端可以用 wxMEDIABACKEND_DIRECTSHOW,GNU/Linux 上用 wxMEDIABACKEND_GSTREAMER。pymedia 也是一个前端,它自己无法播放视频文件。它借助 pygame 来做这件麻烦事。目前,Debian 还没有收录 pymedia,所以现在先考虑 wx.media。

Comments »

The URI to TrackBack this entry is: http://tchaikov.blogsome.com/2006/06/05/p31/trackback/

No comments yet.

RSS feed for comments on this post.

Leave a comment

Line and paragraph breaks automatic, e-mail address never displayed, HTML allowed: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>


Get free blog up and running in minutes with Blogsome
Theme designed by Jay of onefinejay.com