CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Memory Manager

Cod-pro-95
Cod-pro-95
Niveau 7
03 octobre 2017 à 20:43:53

Salut à tous !
Je me suis penché sur la question des "memory manager" dans la création de jeu video. C'est le moyen de ne pas faire d'allocation dans le jeu pdt son exécution ( et donc de le ralentir avec des news par exp ), mais de gérer l'allocation avant ! Mais.. même si je suis d'accord sur la théorie, en pratique rien avance sur mon code c++. Les articles anglais la dessus sont assez indigestes :/
Quelqu'un pour éclairer ma lanterne ?
Merci bien !

godrik
godrik
Niveau 30
03 octobre 2017 à 23:01:24

la technique de base est de faire ca a la starcraft. Tu ne supporte que 256 unites dans le jeu par joueur et une carte d'au plus une taille precise. Du coup, tu peux faire toute ton allocation memoire une fois pour toute.
En pratique toutes les techniques que je connais font essentiellement ca. Comme tu connais la taille max de toute les structure de donnees, tu peux directement allouer ca. Et toutes les indexations deviennent directe.

Cod-pro-95
Cod-pro-95
Niveau 7
05 octobre 2017 à 20:53:01

Merci de ta réponse !
J'ai bien compris tout ça, le vrai problème est le code ! J'ai un exemple de proto a suivre :

class StackAllocator
{
public :
// Construct the allocator
explicit StackAllocator ( u64 size ) ;

// Get a marker to the current top
u64 getMarker ( ) ;

// Allocates a new block from the top
void∗ alloc ( u64 size ) ;

// Rolls the stack back to a previous marker
void freeToMarker ( u64 marker ) ;

// Clear the whole stack
void clear ( ) ;
};

Si je comprend bien le code attendu, je dois faire un tableau de ma classe StackAllocator comme ca :


private:
   MaClass *tab;

Puis dans le constructeur le remplir comme ca?


tab=(MaClass *)malloc(sizeof(MaClass )*size);

Ou c'est pas du tout les mallocs sur les classes qu'il faut utiliser ici ?

godrik
godrik
Niveau 30
05 octobre 2017 à 21:19:21

Il te faut avoir fait une allocation au debut. et apres tu alloue directmetn dans ce bloc de memoire. et regarde "placement new"

Message édité le 05 octobre 2017 à 21:19:55 par godrik
Cod-pro-95
Cod-pro-95
Niveau 7
05 octobre 2017 à 21:21:11

J'ai trouvé ca, je suis en train d'essayer de le mettre en place :)



void* a = malloc(sizeof(A)); // allocate raw memory 
A* obj = new(a) A(); // placement new syntax runs the constructor of A()

godrik
godrik
Niveau 30
05 octobre 2017 à 22:02:15

yep c'est l'idee. Note que quand tu fais ca, tu alloue toujours de la memorire nouvelle. Il te faut faire l'indexation directement dans de la memoire que tu as alloue a l'avance.

Cod-pro-95
Cod-pro-95
Niveau 7
05 octobre 2017 à 23:09:38

Mince !
Je pensais que le new avec le para (void*) permettait d'éviter cela !
( toujours aller lire la doc ! honte a moi ! )
Bon je suppose que par indexation direct tu veux dire :
tab[0] = ..
égal quoi, je ne sais pas en faite.
Si c'était un tableau de int rien de plus simple, tab[0] = 42; par exp
Mais un tableau de classe je vois pas pour l'indexation direct, je dois être fatigué !
Un truc du genre ? :
tab[0] = MaClass mc();

Quand on débarque du monde Java, le c++ et la mémoire ca fait mal !

En tout cas merci de tes réponses qui m'ont bien aidées déjà !

godrik
godrik
Niveau 30
06 octobre 2017 à 03:30:36

Le placement new en effet permet de controller le placement memoire. Mais si tu obtiens la memoire avec malloc, ca ne change rien par rapport a de l'allocation dynamiqie standars. Ce que tu veux c'est placer ton objet dams un gros bout de memoire prealloier.

lokilok
lokilok
Niveau 16
06 octobre 2017 à 13:35:16

Quand on débarque du monde Java, le c++ et la mémoire ca fait mal !

Avec les smarts pointers je trouve la gestion de la mémoire plus simple en C++ qu'en java personnellement.

Sous forums
  • Aide à l'achat Mac
  • Internet
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment