Skip to main content
Cette rubrique est propre à la XBOX One.
L’ESRAM (Enhanced Static Random Access Memory) est une mémoire RAM dédiée de 32 Mo à laquelle seul le GPU peut accéder directement. Cette mémoire offre une bande passante extrêmement élevée, ce qui permet au GPU de lire et d’écrire des données rapidement. L’ESRAM peut être utilisée pour presque n’importe quelle ressource Direct3D, comme les cartes d’ombres, les mémoires tampons et les textures. Pour tirer le meilleur gain de performances de l’ESRAM, utilisez-la pour stocker les données auxquelles vous accédez le plus fréquemment. Les sections suivantes expliquent comment gérer efficacement l’ESRAM sur un kit de développement XBOX One. La section du didacticiel décrit des types de données et des fonctionnalités utiles pour un gestionnaire de mémoire ESRAM.

Types de données pouvant résider dans l’ESRAM

  • L’ESRAM de la XBOX One est une mémoire dédiée à haute bande passante (duplex) de 32 Mo.
  • L’ESRAM est destinée à stocker les cibles de rendu et de profondeur, les cartes d’ombres, les lightmaps et d’autres ressources à haute bande passante.
  • Des paramètres de création de ressources permettent de spécifier la résidence en ESRAM.
  • L’ESRAM permet de stocker des mémoires tampons et des textures 1D, 2D et 3D.
  • L’ESRAM prend en charge uniquement les usages par défaut et immuables. Le CPU n’a pas accès à l’ESRAM.
  • Les chaînes de permutation ne peuvent pas être stockées dans l’ESRAM.

Gestionnaire ESRAM

Le choix des données à stocker dans l’ESRAM est important. Vous devez stocker dans l’ESRAM les données auxquelles vous accédez le plus fréquemment, et ces données changeront probablement au fil de la progression de votre jeu, par exemple lors des transitions entre niveaux. Il est donc conseillé d’implémenter un gestionnaire de mémoire ESRAM. Il n’existe pas de gestionnaire ESRAM prédéfini ; vous devrez créer votre propre gestionnaire ESRAM pour votre projet et l’adapter à vos besoins spécifiques. Un gestionnaire ESRAM fonctionne de manière similaire à un gestionnaire de mémoire traditionnel. Le gestionnaire ESRAM doit au minimum assurer les fonctions suivantes : allouer de la mémoire, charger et décharger des données depuis la DRAM, et libérer la mémoire qui n’est plus nécessaire. Vous trouverez ci-dessous des exemples de types de données et de fonctions courants que votre gestionnaire ESRAM est susceptible d’utiliser.

Classe ESRAMAllocation : une allocation dans l’ESRAM

Allocation ESRAM : cette classe définit un bloc de mémoire contigu qui a été alloué dans l’ESRAM, ainsi qu’un pointeur vers cette mémoire. C++

Classe ESRAMResource : une ressource allouée dans l’ESRAM

Ressource ESRAM : cette classe est essentiellement un wrapper de la classe ESRAMAllocation, avec une valeur de barrière (fence) supplémentaire. Les valeurs de barrière sont des identifiants uniques attribués à des opérations GPU ou DMA spécifiques. Utilisez les valeurs de barrière pour vous assurer que les ressources ne sont utilisées qu’au moment approprié. C++

Classe ESRAMTexture : une texture allouée dans l’ESRAM

Texture ESRAM : une texture allouée dans l’ESRAM. Elle contient la ressource ESRAM, un pointeur de texture et divers pointeurs de vue associés à cette texture. C++

Classe ESRAMBuffer : une mémoire tampon allouée dans l’ESRAM

Mémoire tampon ESRAM : un exemple de mémoire tampon allouée dans l’ESRAM. Elle contient la ressource ESRAM et un pointeur vers la mémoire tampon. C++

Classe FreeSpace : une zone d’espace libre dans l’ESRAM

Espace libre : la plupart des gestionnaires de mémoire allouent de grands blocs de mémoire en une seule fois, puis subdivisent ces blocs en morceaux plus petits à attribuer. Cette approche est nettement plus rapide, mais a tendance à produire de petits blocs de mémoire inutilisés. Utilisez la classe FreeSpace pour suivre les blocs de mémoire inutilisés. Il est conseillé, sans être obligatoire, d’allouer toute l’ESRAM sous la forme d’un seul FreeSpace lors de l’initialisation de votre gestionnaire ESRAM. C++

ESRAMManager::Allocate : alloue de la mémoire dans l’ESRAM en recherchant le premier espace adapté

La fonction Allocate parcourt tous les FreeSpaces jusqu’à trouver un espace suffisamment grand pour contenir les données à allouer. Une fois un espace approprié trouvé, Allocate renvoie l’emplacement mémoire et met à jour la liste FreeSpace en conséquence. C++

ESRAMManager::Free : libère de la mémoire dans l’ESRAM

La fonction Free fait l’inverse de la fonction Allocate. Appelez Free sur les données que vous ne souhaitez plus stocker dans l’ESRAM. Free efface les données et réintègre cette mémoire dans la liste FreeSpace. C++

ESRAMManager::InsertGPUWait : indique au GPU d’attendre une opération DMA impliquant la ressource

La fonction InsertGPUWait empêche le GPU d’accéder aux données ESRAM pendant que ces données sont manipulées. Les barrières indiquent au GPU d’attendre. Cette opération doit être effectuée après un Prefetch ou un Writeback. C++

ESRAMManager::Create : crée une mémoire tampon dans l’ESRAM sans contenu initial

La fonction Create prend des données en entrée, les convertit dans des formats gérables par l’ESRAM, puis appelle la fonction Allocate pour obtenir un bloc de mémoire. Si un bloc de mémoire suffisamment grand est disponible, créez les ressources à l’aide de ID3D11Device. C++

ESRAMManager::Prefetch : prélit des données à partir d’une mémoire tampon DRAM

La fonction Prefetch copie des données de la DRAM vers l’ESRAM. C++

ESRAMManager::Writeback : copie une mémoire tampon ESRAM dans la DRAM

La fonction Writeback fait l’inverse de la fonction Prefetch : elle copie des données de l’ESRAM vers la DRAM. C++

ESRAMManager::Discard : marque une ressource ESRAM comme n’étant plus utilisée, afin que sa mémoire puisse être récupérée

La fonction Discard abandonne les données stockées dans l’ESRAM lorsqu’elles ne sont plus nécessaires. Lors de l’abandon de données, insérez une barrière pour vous assurer que les données ne sont pas supprimées avant que le GPU n’ait fini de les utiliser. Ensuite, placez la ressource dans une liste d’objets abandonnés que le garbage collector libérera ultérieurement. C++
C++

ESRAMManager::GarbageCollect : libère la mémoire appartenant aux ressources abandonnées

La fonction GarbageCollect parcourt la liste des ressources abandonnées, attend qu’elles ne soient plus utilisées par le GPU, puis appelle la fonction Free sur celles-ci. La fonction Free efface les données et réinsère l’espace désormais vide dans la liste FreeSpace. C++
Last modified on October 6, 2026