Захват данных планшета с постоянной скоростью, а не с частотой кадров (python, pygame, wintab, cgkit) - PullRequest
1 голос
/ 22 октября 2010

Прежде всего, я не опытный программист на любом языке.Но последние пару месяцев я в значительной степени возился с питоном, поэтому я не считаю себя полностью зеленым.

Некоторые ключевые слова для вас:
- Windows
- Python 2.6
- Pygame, CGKit

Хорошо, у меня есть модуль CGKit, который содержит оболочку WinTab для сбора данных с планшета Wacom.WinTab требует, чтобы определенное окно было активным, чтобы начать захват, и для этого я использую PyGame.Тем не менее, PyGame довольно жесток с процессором и дает мне от 100 до 200 кадров в секунду при рисовании простого текста и прямоугольников (метры для входных данных wacom.) И около 200-400 кадров в секунду, когда ничего не «стряхивает».* Теперь аппаратное обеспечение планшета и WinTab API поддерживают скорость передачи 200 Гц, и это хорошо.Проблема в том, что данные, которые я получаю из WinTab, не имеют частоту 200 Гц (5 мс на пакет), а вместо этого соответствуют текущей частоте кадров моего окна PyGame, которая, помимо всего прочего, не является статичной.

Итак, вы видите проблему.Чтобы WinTab мог получить какие-либо данные, ему должно быть назначено окно, и он должен быть «активным».Но наличие открытого окна PyGame означает, что поток данных ограничен частотой кадров окна Pygame.

Я уверен, что есть другие оконные менеджеры, которые я мог бы использовать, которые не будут занимать ни одного, или небольшого процессора, но мне бы очень хотелось, чтобы WinTab получал данные с постоянной частотой 200 Гц без какой-либоЗависимости.

Я думаю, многопоточность.Разбиение данных о сборке и рисовании, но поскольку WinTab нужно окно для получения каких-либо данных, я не могу понять, как это возможно.

Также обратите внимание, что я никогдапронизывал что-либо раньше, хотя я понимаю концепцию.

Итак, надеюсь, я достаточно ясно объяснил проблему.

Вопрос , как я могу получить данные с минимальной частотой 200 Гц, при этом все еще имея возможность делать, возможно, 20-30 кадров в секунду в моем окне PyGame?

1 Ответ

1 голос
/ 11 ноября 2010

не имея опыта в этой области, я бы сказал, что потоки не являются хорошей идеей для точных функций синхронизации. Из того, что я изучал, нет точного времени, навязанного им.

Я помню, что внутри модуля time pygame есть функция, которая заставляет ваш код работать в определенное время и таким образом ограничивает FPS. Это если ваш код работает слишком быстро.

Теперь, если ваше приложение работает слишком медленно для частоты 200 МГц, то есть для цикла требуется более 5 мс, вам придется переместить часть кода в домен C / C ++ и избегать использования pygame хотя бы для этой части. Я советую использовать Cython, поскольку Cython позволяет писать только код Python, и вам не нужно знать C / C ++. Но, конечно, вы можете смешивать Python с C / C ++ и даже Fortran с Cython, это чрезвычайно гибкий и простой в использовании.

Сайт Cython

Мой опыт работы с pygame на процессоре Atom 1,6, который, конечно, очень медленный, дал мне 1 мс для нулевого перерисовывания, поэтому pygame может быть очень быстрым, но не быстрым. Это будет сильно зависеть от того, что вы рисуете на экране во время цикла. Я бы предположил, что в основном дуэте эта 1 мс должна упасть как минимум до 0,3 мс. Так что это также будет зависеть от вашей скорости обработки.

Другим подходом является многопроцессорный модуль, который может полностью использовать несколько ядер и назначать одно ядро ​​для вашего приложения и другое ядро ​​для получения данных с планшета.

Документация по многопроцессорным модулям

Есть буквально сотни способов ускорить Python.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...