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 );
}