【问题标题】:Capturing tablet data at constant rate, instead of at frame rate (python, pygame, wintab, cgkit)以恒定速率而不是帧速率捕获平板电脑数据(python、pygame、wintab、cgkit)
【发布时间】:2010-10-22 04:29:41
【问题描述】:

首先,我不是任何语言的资深程序员。但在过去的几个月里,我一直在大量地修补 python,所以我也不认为自己完全是绿色的。

为您提供一些关键字:
- 窗户
- Python 2.6
- Pygame,CGKit

好的,我得到了 CGKit 模块,它包含一个用于从 Wacom 数位板捕获数据的 WinTab 包装器。 WinTab 需要某个窗口处于活动状态才能开始捕获,为此我正在使用 PyGame。然而,PyGame 在 CPU 上的表现相当残酷,在绘制简单文本和矩形(wacom 输入数据的米)时,我的速度在 100-200 fps 之间,而在不“blitting”任何东西时,速度大约为 200-400 fps。

现在,平板电脑硬件和 WinTab API 支持 200hz 的传输速率,这一切都很好。问题是我从 WinTab 获得的数据不是 200hz(每个数据包 5 毫秒),而是我的 PyGame 窗口的当前帧速率,最重要的是,它不是静态的。

所以你看到了问题。为了让 WinTab 获取任何数据,它必须有一个分配给它的窗口并且它需要是“活动的”。但是打开 PyGame 窗口意味着数据流受限于 pygame 窗口的帧速率。

我确信我可以使用其他不会占用任何或很少 CPU 的窗口管理器,但我真正想要的是 WinTab 以恒定 200hz 的速率获取数据而没有任何依赖关系。

我在考虑线程。分解收集数据和绘图部分,但由于 WinTab 首先需要一个窗口来获取任何数据,我不知道这怎么可能。

另外请注意,我以前从未线程过任何东西,尽管我确实理解这个概念。

所以,希望我把问题讲得很清楚。

问题是,我怎样才能获得至少 200hz 的数据,同时仍然能够在我的 PyGame 窗口上以 20-30 fps 的速度运行?

【问题讨论】:

  • 我在 stackovfw 上的第一个问题显然太薄了。当您的问题过于具体时,就会发生这种情况:)

标签: python windows pygame


【解决方案1】:

如果没有这方面的经验,我会说线程对于精确的计时功能来说不是一个好主意。根据我的研究,并没有对它们强制执行精确的时间安排。

我记得时间 pygame 模块中有一个函数可以强制您的代码在特定时间运行,从而限制 FPS。那是为了如果你的代码运行太快。

现在,如果您的应用在 200Mhz 速率下被证明太慢,即循环需要超过 5 毫秒,那么您将不得不将您的一些代码移动到 C/C++ 域,并至少避免在这部分使用 pygame。我建议使用 cython ,因为 cython 只允许您编写 python 代码,而您不需要了解 C/C++。当然,你可以将 python 与 C/C++ 甚至 Fortran 与 cython 混合使用,它非常灵活且易于使用。

Cython Website

我在 Atom 1,6 处理器上使用 pygame 的经验,当然非常慢,给了我 1 毫秒的零重绘,所以 pygame 可以非常快,但不会很快。这在很大程度上取决于您在循环期间在屏幕上绘制的内容。我猜想在一个核心二重奏上,1 ms 应该下降到至少 0.3 ms。所以这也取决于你的处理速度。

另一种方法是多处理模块,它可以充分利用多个内核,并为您的应用分配一个内核,另一个内核用于从平板电脑接收数据。

Multiprocessing module documentation

实际上有数百种方法可以加速 python。

【讨论】:

  • 很好的答案。现在有很多东西要研究。谢谢!
猜你喜欢
  • 2021-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多