Memory Pool

Signaler
Messages postés
92
Date d'inscription
jeudi 28 novembre 2002
Statut
Membre
Dernière intervention
1 octobre 2003
-
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
-
Bonjour,

j'ai téléchargé la partie du code source de Quake3 releasé par ID Software par curiosité.
Je l'ai lu pour voir un peu comment le jeu fonctionnait et quelque chose m'a interpelé : la memory pool

ils déclarent une tableau de char de 256 Mo (char MemoryPool[256 * 1024];)

et lorsqu'ils ont besoin d'une allocation de mémoire (de type new ou malloc() en C), ils utilisent une fonction a eux qui renvoit un pointeur se situant dans le tableau des char.

A chaque allocation ils avancent le pointeur de n position (n etant la taille demandée) et le renvoient.

Quel est l'interet d'un tel systeme ? La vitesse ? Est-ce qu'un malloc prend-il autant de temps ?

C'est plutôt "bête" car le programme utilise d'office 256Mo de mémoire et ya pas de fonctions pour désallouer la memoire dans leur système.

voici un copier coller de leur système de gestion de la mémoire :

// Copyright (C) 1999-2000 Id Software, Inc.
//
//
// g_mem.c
//

#include "g_local.h"

#define POOLSIZE (256 * 1024)

static char memoryPool[POOLSIZE];
static int allocPoint;

void *G_Alloc( int size ) {
char *p;

if ( g_debugAlloc.integer ) {
G_Printf( "G_Alloc of %i bytes (%i left)\n", size, POOLSIZE - allocPoint - ( ( size + 31 ) & ~31 ) );
}

if ( allocPoint + size > POOLSIZE ) {
G_Error( "G_Alloc: failed on allocation of %i bytes\n", size ); // bk010103 - was %u, but is signed
return NULL;
}

p = &memoryPool[allocPoint];

allocPoint += ( size + 31 ) & ~31;

return p;
}

void G_InitMemory( void ) {
allocPoint = 0;
}

void Svcmd_GameMem_f( void ) {
G_Printf( "Game memory status: %i out of %i bytes allocated\n", allocPoint, POOLSIZE );
}

3 réponses

Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
La vitesse assurement, quant au fait de ne pas desallouer on se doute qu'on utilise ce type de jeu en mono tache sinon le systeme devra recopier tout cela dans son fichier de pagination pour liberer la memoire.
BruNews, ciao...
Messages postés
92
Date d'inscription
jeudi 28 novembre 2002
Statut
Membre
Dernière intervention
1 octobre 2003
1
Ok mais je trouve pas ca propre...

Que se passe-t-il si, admettons, un joueur joue longtemps sans relancer le jeu ?

ca va alloc a n'en plus finir, le buffer de 256Mo va être plein. seule solution : relancer le jeu. Mouais....
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
Je ne suis pas alle voir le code mais je suppose qu'il y a verif des zones disponibles du buffer. En tout cas vu les 2 especes de genie de la prog qui ont participe a la creation de ce jeu, je presume cela tres bon.
Tu as lu Michael Abrash, Prog C/C++ et ASM, vaut le detour.
BruNews, ciao...