首先,我不是任何语言的资深程序员。但是在过去的几个月里我一直在修补python,所以我不会认为我的自己完全是绿色的。
为您提供的一些关键字:
- Windows
- Python 2.6
- Pygame,CGKit
好的,所以我有CGKit模块,它包含一个WinTab包装器,用于从Wacom平板电脑捕获数据。 WinTab要求某个窗口处于活动状态才能开始捕获,为此我正在使用PyGame。然而,PyGame在CPU上非常残酷,在绘制简单的文本和矩形(wacom输入数据的米)时给我100到200帧/秒的速度,在没有'blitting'任何东西的时候给我200到600帧/秒的速度。
现在,平板电脑硬件和WinTab API支持200hz的传输速率,这一切都很好。问题是我从WinTab得到的数据不是200hz(每包5ms),而是在我的PyGame窗口的当前帧速率,除了一切之外,它不是静态的。
所以你看到了问题。为了让WinTab获取任何数据,它必须有一个分配给它的窗口,它需要是“活动的”。但是打开PyGame窗口意味着数据流限制在pygame窗口的帧速率。
我确信我可以使用的其他窗口管理器不占用任何或很少的CPU,但我真正喜欢的是WinTab以恒定的200hz速率获取数据而没有任何依赖。< / p>
我在想线程。打破收集数据和绘图部分,但由于WinTab需要一个窗口来获取任何数据,我无法弄清楚这是怎么可能的。
另请注意,我之前从未做过任何事情,但我确实理解这个概念。
所以,希望我能够清楚地解决问题。
问题是,我如何才能获得至少200hz的数据,同时在我的PyGame窗口上仍然能够做到20-30 fps?
答案 0 :(得分:1)
如果没有这方面的经验,我会说线程不是精确计时功能的好主意。根据我的研究,没有对它们实施精确的时间安排。
我记得时间pygame模块中有一个函数强制你的代码在特定时间运行,从而限制了FPS。这是因为如果你的代码运行得太快。
现在,如果您的应用程序对于200Mhz速率证明太慢,那么循环需要5ms以上,那么您必须将一些代码移动到C / C ++域并避免至少使用pygame这一部分。我建议使用cython,因为cython允许你只编写python代码而你不需要知道C / C ++。但是当然你可以将python与C / C ++甚至Fortran与cython混合使用,它非常灵活且易于使用。
我在Atom 1,6处理器上使用pygame的经验,当然非常慢,给了我1 ms的零重绘,所以pygame可以非常快但不会快速眩目。它将在很大程度上取决于您在循环期间在屏幕上绘制的内容。我想在一个核心二重奏上,1 ms应该下降到至少0.3 ms。所以它还取决于你的处理速度。
另一种方法是多处理模块,它可以充分利用多个核心并为您的应用程序分配一个核心,为从平板电脑接收数据分配另一个核心。
Multiprocessing module documentation
有很多方法可以加快python的速度。