Memory Pool

guiguikun Messages postés 92 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 1 octobre 2003 - 25 août 2003 à 16:55
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 25 août 2003 à 17:57
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

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
25 août 2003 à 17:02
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...
0
guiguikun Messages postés 92 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 1 octobre 2003 1
25 août 2003 à 17:49
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....
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
25 août 2003 à 17:57
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...
0
Rejoignez-nous