Открыть сервис

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 включает следующие этапы:

  1. Инициализация: создание объекта IDirectInput8 с помощью функции DirectInput8Create.
  2. Перечисление устройств: получение списка доступных устройств ввода с помощью метода EnumDevices.
  3. Создание устройства: вызов метода CreateDevice для получения интерфейса IDirectInputDevice8 для конкретного устройства.
  4. Установка формата данных: определение структуры данных, которые будет передавать устройство (например, формат кнопок и осей).
  5. Установка кооперативного уровня: определение уровня доступа к устройству (например, эксклюзивный или фоновый режим).
  6. Получение данных: циклический опрос устройства с помощью метода 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

ПараметрDirectInputXInput
Дата выхода1995 (DirectX 1.0)2005 (DirectX 9.0c)
Целевые устройстваЛюбые устройства вводаКонтроллеры Xbox 360/One/Series X\S
Максимальное количество кнопок12810 (стандарт)
Максимальное количество осей64 (аналоговых)
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 →