DirectInput
DirectInput — это компонент Microsoft DirectX, представляющий собой программный интерфейс (API) для обработки ввода с различных устройств, таких как клавиатура, мышь, джойстики, геймпады, рули и другие игровые контроллеры. DirectInput обеспечивает прямой доступ к устройствам ввода, минуя стандартные механизмы операционной системы Windows, что позволяет разработчикам получать более точные и быстрые данные, а также обрабатывать нестандартные устройства.
История
DirectInput был представлен в 1995 году вместе с первой версией DirectX (DirectX 1.0) для операционной системы Windows 95. Основной целью создания DirectInput было решение проблем с задержками и несовместимостью, возникавшими при использовании стандартных API Windows для обработки ввода в играх. В ранних версиях DirectX DirectInput был единственным способом получить доступ к джойстикам и другим игровым контроллерам.
В DirectX 8 (2001 год) в DirectInput были внесены значительные улучшения, включая поддержку Force Feedback (силовой обратной связи) и улучшенную работу с несколькими устройствами. Однако с выходом DirectX 9 (2002 год) и последующих версий Microsoft начала постепенно отказываться от DirectInput в пользу более современного API — XInput, который был разработан специально для контроллеров Xbox и стал стандартом для игр на платформе Windows.
В DirectX 11 и DirectX 12 DirectInput остаётся доступным для обратной совместимости, но официально считается устаревшим. Microsoft рекомендует использовать XInput для контроллеров Xbox и Windows.Gaming.Input (часть Universal Windows Platform) для современных устройств ввода.
Архитектура и принцип работы
DirectInput работает на основе модели COM (Component Object Model). Основными компонентами API являются:
- IDirectInput8 — основной интерфейс для создания устройств и управления ими.
- IDirectInputDevice8 — интерфейс для работы с конкретным устройством ввода.
- IDirectInputEffect — интерфейс для управления эффектами силовой обратной связи.
Процесс работы с DirectInput включает следующие этапы:
- Инициализация: создание объекта IDirectInput8 с помощью функции
DirectInput8Create. - Перечисление устройств: получение списка доступных устройств ввода с помощью метода
EnumDevices. - Создание устройства: вызов метода
CreateDeviceдля получения интерфейса IDirectInputDevice8 для конкретного устройства. - Установка формата данных: определение структуры данных, которые будет передавать устройство (например, формат кнопок и осей).
- Установка кооперативного уровня: определение уровня доступа к устройству (например, эксклюзивный или фоновый режим).
- Получение данных: циклический опрос устройства с помощью метода
GetDeviceStateилиPoll.
Кооперативный уровень
DirectInput поддерживает несколько кооперативных уровней, определяющих, как приложение взаимодействует с устройством ввода:
- DISCL_FOREGROUND — приложение получает данные только когда находится на переднем плане.
- DISCL_BACKGROUND — приложение может получать данные даже в фоновом режиме.
- DISCL_EXCLUSIVE — приложение получает эксклюзивный доступ к устройству (другие приложения не могут его использовать).
- DISCL_NONEXCLUSIVE — устройство может использоваться несколькими приложениями одновременно.
Возможности и особенности
Поддержка различных устройств
DirectInput поддерживает широкий спектр устройств ввода, включая:
- Клавиатуры и мыши (хотя для них чаще используются стандартные сообщения Windows).
- Джойстики и геймпады (аналоговые и цифровые).
- Руль и педали.
- Трекболы, графические планшеты.
- Устройства с силовой обратной связью (Force Feedback).
- Нестандартные и специализированные контроллеры.
Force Feedback (силовая обратная связь)
DirectInput предоставляет API для управления эффектами силовой обратной связи на совместимых устройствах (например, игровых рулях с обратной связью). Поддерживаются следующие типы эффектов:
- Постоянная сила (Constant Force) — постоянное усилие в одном направлении.
- Периодическая сила (Periodic Force) — колебательное усилие (синусоида, пила, прямоугольные волны).
- Рампа (Ramp Force) — плавное изменение усилия от начального до конечного значения.
- Условие (Condition) — имитация физических свойств (трение, упругость, инерция).
- Пользовательский (Custom Force) — произвольная форма усилия, задаваемая массивом данных.
Низкоуровневый доступ
В отличие от XInput, DirectInput позволяет получать «сырые» данные с устройства, включая показания всех осей и кнопок, даже если они нестандартны. Это делает DirectInput незаменимым для работы с необычными или самодельными контроллерами.
Сравнение с XInput
| Параметр | DirectInput | XInput | |
|---|---|---|---|
| Дата выхода | 1995 (DirectX 1.0) | 2005 (DirectX 9.0c) | |
| Целевые устройства | Любые устройства ввода | Контроллеры Xbox 360/One/Series X\ | S |
| Максимальное количество кнопок | 128 | 10 (стандарт) | |
| Максимальное количество осей | 6 | 4 (аналоговых) | |
| Force Feedback | Поддерживается | Поддерживается (упрощённо) | |
| Вибрация | Нет встроенной | Есть (два мотора) | |
| Поддержка нескольких контроллеров | Ограниченная | До 4 одновременно | |
| Сложность использования | Высокая | Низкая | |
| Актуальность | Устаревший | Рекомендуемый |
Применение
Несмотря на устаревание, DirectInput продолжает использоваться в ряде областей:
- Старые игры: многие игры, выпущенные до 2005 года, используют DirectInput. Для их запуска на современных системах может потребоваться установка DirectX 9.0c.
- Симуляторы: авиасимуляторы, автосимуляторы и космические симуляторы часто используют DirectInput для поддержки сложных контроллеров с множеством осей и кнопок (например, штурвалы, педали, панели переключателей).
- Эмуляторы: программы для эмуляции игровых консолей (например, PCSX2, Dolphin) часто поддерживают DirectInput для подключения оригинальных контроллеров.
- Специализированное оборудование: DirectInput используется для работы с промышленными контроллерами, медицинским оборудованием и другими нестандартными устройствами ввода.
Критика и недостатки
- Устаревшая архитектура: DirectInput основан на COM, что усложняет его использование в современных языках программирования и средах разработки.
- Отсутствие поддержки вибрации: в отличие от XInput, DirectInput не имеет встроенной поддержки вибрации геймпадов. Разработчикам приходится реализовывать её через Force Feedback, что сложнее.
- Проблемы с современными контроллерами: многие современные геймпады (например, DualShock 4, DualSense) не полностью совместимы с DirectInput без дополнительных драйверов или утилит.
- Сложность настройки: для корректной работы с некоторыми устройствами требуется ручная настройка калибровки и mapping кнопок.
Будущее
Microsoft не развивает DirectInput с 2008 года (DirectX 11). В Windows 10 и Windows 11 DirectInput доступен только для обратной совместимости. Основным API для ввода в играх является XInput, а для универсальных приложений Windows — Windows.Gaming.Input. Тем не менее, DirectInput остаётся важным инструментом для поддержки legacy-игр и специализированного оборудования.
Источники
- Microsoft Developer Network (MSDN): DirectInput documentation.
- «DirectX 9.0c Programmer's Reference» (Microsoft Corporation, 2004).
- «Game Engine Architecture» by Jason Gregory (CRC Press, 2014).
- «Windows Game Programming with DirectX» by André LaMothe (Premier Press, 2002).
- Статья «DirectInput vs XInput» на сайте MSDN (2005).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →