Skip to main content
Le portage de XInput vers GameInput est le moins compliqué de toutes les anciennes API. En effet, GameInput a été fortement inspiré par le modèle de programmation simple (et facile à utiliser) de XInput ; de nombreuses API XInput ont donc un équivalent direct dans GameInput.

Différences clés

Les différences clés entre XInput et GameInput sont abordées dans les sections suivantes.

C et C++

L’API XInput est un ensemble de fonctions C simples. GameInput, en revanche, est en C++ et utilise des interfaces (tout comme les API graphiques et audio). En pratique, cela ne complique pas le code qui utilise l’API GameInput, n’a pas d’incidence sur les performances et présente certains avantages qui deviennent évidents à mesure que vous vous familiarisez avec le fonctionnement de GameInput. Il est important de comprendre que, même si ces interfaces peuvent ressembler à COM, elles n’en sont pas. Une compréhension de base du comptage de références suffit pour utiliser ces interfaces. Pour plus d’informations, consultez la section Interfaces de la rubrique Notions fondamentales de GameInput.

Obtention des entrées

Avec XInput, la plupart des jeux parcourent les index d’utilisateur jusqu’à en trouver un auquel un périphérique est connecté, puis lisent l’état de ce périphérique. Les jeux mémorisent souvent l’index d’utilisateur pour ne pas avoir à refaire la boucle la fois suivante. Par exemple, le code suivant est typique d’un jeu qui invite l’utilisateur à « appuyer sur A » sur sa manette :
Avec GameInput, vous obtenez d’abord l’entrée sans spécifier de périphérique, et vous pouvez ensuite déterminer de quel périphérique provient l’entrée si vous le souhaitez. Le code est similaire, mais l’absence d’énumération explicite des périphériques peut conduire à des algorithmes plus simples.
Le code n’est pas tout à fait aussi simple qu’avec XInput, mais il est très similaire. À mesure que vous vous familiariserez avec l’API GameInput, vous verrez que ce modèle offre des options puissantes de gestion des entrées qui n’existent pas dans XInput. Notez également que XInput retourne les valeurs analogiques des gâchettes sous le type BYTE et celles des sticks sous le type SHORT. Avec l’API GameInput, ces valeurs analogiques sont retournées sous forme de valeurs float comprises entre 0 et 1 (gâchettes) ou entre -1 et 1 (sticks).

Retour par vibration

Avec XInput, les jeux appellent simplementXInputSetState pour envoyer des commandes de vibration à un périphérique. Avec GameInput, les jeux doivent obtenir l’instance IGameInputDevice du périphérique, puis appeler sa méthode SetRumbleState. L’utilisation de ces deux méthodes est similaire. C’est un exemple de cas où vous appelez des fonctions de l’interface du périphérique, au lieu de l’utiliser uniquement comme identificateur de périphérique.

Focus de l’application

Sur console, GameInput fournit des entrées à une application uniquement lorsqu’elle a le focus. Dans le cas contraire, l’état retourné contient des valeurs neutres ou « au repos », comme si l’utilisateur ne touchait pas du tout le périphérique. Cela évite d’avoir à écrire du code d’entrée supplémentaire pour gérer les changements de focus (par exemple, l’appel deXInputEnable). Sur PC, les entrées sont envoyées à tous les processus par défaut. À l’avenir, ce comportement pourra être modifié à l’aide de la méthode SetFocusPolicy.

Le wrapper XInputOnGameInput

Le Microsoft Game Development Kit (GDK) est fourni avec un fichier d’en-tête appeléXInputOnGameInput.h qui contient une implémentation de l’API XInput basée sur GameInput. Nous recommandons d’effectuer le portage directement vers GameInput, en particulier si vous souhaitez prendre en charge le clavier et la souris ou d’autres périphériques d’entrée. Toutefois, le wrapper XInputOnGameInput peut être utilisé pour amorcer un premier effort de portage sans nécessiter de modifications du code XInput existant. Pour utiliser le wrapper XInputOnGameInput, remplacez simplement ce code :
par ce code :
puis recompilez votre code. L’implémentation du code du wrapper XInput se trouve entièrement dans le fichier d’en-tête ; elle peut donc également être étudiée comme exemple d’utilisation de l’API GameInput et/ou modifiée selon vos besoins.

Différences entre XInput et XInputOnGameInput

En règle générale, le wrapper XInputOnGameInput remplace directement l’ancienne API XInput. Il existe toutefois quelques différences mineures :
  • Par souci de simplicité, seule la prise en charge des manettes a été codée dans le wrapper. Si vous devez prendre en charge d’autres périphériques, comme des volants de course ou des sticks arcade, utilisez directement GameInput ou ajoutez la prise en charge de ces périphériques dans le code de XInputOnGameInput.
  • Le wrapper ne retourne les entrées de manette que lorsque le jeu a le focus. Lorsque le jeu n’a pas le focus, tout état de manette retourné est défini sur des valeurs neutres ou « au repos », comme si l’utilisateur ne touchait pas la manette. Ce comportement s’applique indépendamment des appels àXInputEnable (ou de leur absence).
  • La valeur deXUSER_MAX_COUNT est passée de 4 à 8. Cela devrait généralement être transparent pour la plupart des anciens codes XInput. Veillez toutefois à examiner attentivement toute utilisation de la fonctionXInputGetKeystroke dans votre code pour vous assurer que rien n’est codé en dur en supposant une valeur maximale de 4 retournée dans le membreUserIndex de la structureXINPUT_KEYSTROKE. Sinon, un dépassement de mémoire tampon pourrait se produire.
  • Quelques nouvelles fonctions ont été ajoutées (voir ci-dessous) ; elles ne présentent d’intérêt que si vous prévoyez de continuer à utiliser le wrapper XInput dans du code de production.

Utilisation de XInputOnGameInput dans du code de production

Le wrapper XInputOnGameInput est conçu pour être performant et sans verrou ; il hérite de toutes les optimisations de performances de l’API GameInput et convient donc à une utilisation dans du code de production. Il hérite également de la prise en charge étendue des périphériques de GameInput (comme les manettes HID populaires) et ajoute les nouvelles fonctions suivantes à l’API :
  • XInputSetStateEx est similaire àXInputSetState, mais ajoute la prise en charge des moteurs de gâchettes.
  • XInputGetStateWithToken est similaire àXInputGetState, mais permet à l’appelant de fournir un jeton de pipeline d’images D3DX afin d’associer une lecture d’entrée spécifique à une image graphique en vue d’une analyse ultérieure dans PIX.
    [!NOTE] Dans la version May Preview,XInputGetStateWithToken se comporte actuellement de la même manière queXInputGetState, car le code GameInput sous-jacent n’est pas entièrement implémenté.
  • XInputGetDeviceId retourne leAPP_LOCAL_DEVICE_ID du périphérique associé à un index d’utilisateur donné. La transmission de cet ID à la méthode FindDeviceFromId de IGameInput retourne le IGameInputDevice correspondant à cet index d’utilisateur. Celui-ci peut ensuite être utilisé pour accéder à des fonctionnalités supplémentaires de l’API GameInput qui ne sont pas exposées par le wrapper XInput.

Optimisation du code du wrapper

Par défaut, le wrapper XInputOnGameInput est configuré pour être directement compatible avec l’ancienne API XInput. Les jeux qui n’ont pas besoin d’un comportement 100 % compatible peuvent affiner le comportement et les performances du wrapper en définissant l’une des macros de préprocesseur suivantes :
XINPUT_ON_GAMEINPUT_EXPLICIT_INITIALIZATION
Par défaut, le wrapper XInput initialise automatiquement et de manière différée l’API GameInput sous-jacente lors du premier appel à l’une des fonctions du wrapper. Cela garantit une compatibilité directe avec le code XInput existant, mais présente plusieurs inconvénients mineurs :
  1. Le temps d’exécution du premier appel à une fonction du wrapper XInput est plus long que d’habitude.
  2. Chaque fonction du wrapper XInput doit vérifier, à chaque appel, si l’initialisation différée a été effectuée. Il s’agit d’un simple test d’une variable globale, ce qui permet au prédicteur de branchement d’en atténuer le coût, mais cela reste une surcharge supplémentaire.
  3. Bien qu’elle ne doive jamais échouer, il n’existe aucun moyen de savoir si l’initialisation différée de l’API GameInput sous-jacente a réussi.
  4. L’instance IGameInput sous-jacente n’est pas libérée tant que les variables globales du wrapper XInput ne sont pas nettoyées (soit lors du déchargement du module, soit lors de l’arrêt du processus).
Les jeux peuvent contrôler manuellement l’initialisation et l’arrêt du wrapper en définissant la macroXINPUT_ON_GAMEINPUT_EXPLICIT_INITIALIZATION. Celle-ci ajoute deux nouvelles fonctions,XInputOnGameInputInitialize etXInputOnGameInputUninitialize, qui peuvent être appelées pour contrôler précisément le moment où l’initialisation et l’arrêt se produisent.
XINPUT_ON_GAMEINPUT_NO_XINPUTENABLE
Le code nécessaire à l’implémentation de la fonctionXInputEnable ajoute une surcharge supplémentaire à chaque appel des fonctionsXInputGetState,XInputGetStateWithToken,XInputSetState,XInputSetStateEx etXInputGetKeystroke. Si votre code n’appelle pasXInputEnable, ou si cet appel peut facilement être supprimé de votre code, la définition de la macroXINPUT_ON_GAMEINPUT_NO_XINPUTENABLE supprime la prise en charge deXInputEnable et la surcharge associée. Le code GameInput sous-jacent assure de toute façon automatiquement la fonctionnalité deXInputEnable lors des changements de focus ; la plupart des jeux voudront donc définir cette macro s’ils le peuvent.
XINPUT_ON_GAMEINPUT_NO_XINPUTGETKEYSTROKE
Le code nécessaire à l’implémentation de la fonctionXInputGetKeystroke ajoute quelques fonctions et variables supplémentaires à l’implémentation du wrapper. Il n’ajoute pas de surcharge aux autres fonctions de l’API XInput, mais si votre code n’appelle pasXInputGetKeystroke, vous pouvez définir la macroXINPUT_ON_GAMEINPUT_NO_XINPUTGETKEYSTROKE pour réduire légèrement la taille du code et des données du wrapper XInput.

Documentation de référence de l’API

Voir aussi

Vue d’ensemble de GameInput Référence de l’API GameInput Microsoft Game Development Kit
Last modified on October 6, 2026