python - 以恒定速率而不是帧速率捕获平板电脑数据(python、pygame、wintab、cgkit)

标签 python windows pygame

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

一些适合您的关键字:
- Windows
- Python 2.6
- Pygame,CGKit

好的,我已经有了 CGKit 模块,其中包含一个 WinTab 包装器,用于从 Wacom 数位板捕获数据。 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 的速度?

最佳答案

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

我记得 time 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 毫秒应该下降到至少 0.3 毫秒。所以这也取决于你的处理速度。

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

Multiprocessing module documentation

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

关于python - 以恒定速率而不是帧速率捕获平板电脑数据(python、pygame、wintab、cgkit),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3993900/

相关文章:

Python C++ float 学表示错误

python scipy.odrpack.odr 示例(带有示例输入/输出)?

c# - 应用程序设置中的结构数组

java - 当系统从 hibernate 状态恢复时自动运行应用程序

python - Vertex AI - 查看管道输出

python - 在 Python 中使用 Paramiko 检查是否可以删除目录

c++ - 在 64 位 Windows 中 Hook 32 位进程

python - 你能帮我修复 pygame 物理模拟中的这个错误吗?

python - 在 pygame 中查找 Sprite

Python:类不能从单独的文件调用?