Ottimizzazione lettura modelli 3d da cd-rom

01/08/2024

La memoria RAM della PS1 è limitata a 2MB e, oltre a questo limite, anche la CPU (33.8 MHz) non è particolarmente veloce rispetto agli standard odierni.
Quando ho iniziato ad inserire vari modelli 3d, per gestire le animazioni, ho notato che la lattura da cd-rom era molto veloce, ma il parsing dei dati dei files 3d era molto lento, il problema però non era specifico nella modalità in cui leggevo la geometria dei modelli, ma bensì, di come li caricavo in memoria.
In sostanza, leggevo tutti i dati della geometria, e per ogni indice, riallocavo in memoria con realloc, questo è estremamente lento:

for (i = 0; i < mesh->indicesLength; ++i) { int k; for(k = 0; k < 4; k++){ if(mesh->indices == NULL) { mesh->indices = malloc3(4 * sizeof(int)); if (mesh->indices == NULL) { printf("error on mesh->indices malloc3 \n"); return; } } else { mesh->indices = realloc3(mesh->indices, (4 * (n+1)) * sizeof(int)); if (mesh->indices == NULL) { printf("error on mesh->indices realloc3 \n"); return; } } mesh->indices[n] = f[kk]-1; n++; kk += 2; } }

una soluzione molto semplice è eliminare tutta la parte di malloc e realloc dentro al for, conoscendo già la lunghezza massima degli indici, posso fare un malloc unico:

if(mesh->indices == NULL) { mesh->indices = malloc3((4 * (mesh->indicesLength+1)) * sizeof(int)); if (mesh->indices == NULL) { printf("error on mesh->indices malloc3 \n"); return; } } for (i = 0; i < mesh->indicesLength; ++i) {...}

Il risultato è che, prima, ci voleva circa 30 secondi per caricare i dati dei modelli in RAM, mentre adesso è quasi istantaneo.