Ho cercato di creare un sistema di componenti di entità. Fondamentalmente, un'entità è solo un ID avvolto attorno a una struttura, i componenti sono dati appartenenti a quell'entità (e si riferiscono a detto id), e i sistemi sono il codice. Entità e componenti sono tutti memorizzati all'interno di array, per consentire un'iterazione veloce su ciascuno.
Ad esempio, un'entità potrebbe avere un componente Massa, Posizione e Velocità. Un GravitySystem prenderà in considerazione queste tre componenti, calcolerà una certa velocità (basata sulla massa) e la aggiungerà al componente Posizione.
Il mio problema è, cosa succede quando un'entità viene rimossa dal centro di un array? Un'opzione è di avere l'ultimo elemento delle posizioni di scambio dell'array con l'entità che è stata appena rimossa, in modo che l'array rimanga impacchettato. Il rovescio della medaglia è che perdo la possibilità di fare riferimento a ciascun elemento con lo stesso numero di indice, cioè l'ID 5 dell'entità è nell'indice 5 e ogni componente che appartiene a quell'entità si trova anch'esso nell'indice 5 all'interno dei propri array.
Una soluzione sarebbe chiedere semplicemente se l'entità [i] è "attiva" prima di ogni iterazione. Qualcosa di simile,
void gravitySystem(entityList[], massList[], velocityList[], positionList[])
{
for(int i = 0; i < 100; ++i) {
if(entityList[i].isAlive == 1) {
velocityList[i] += 9.81 * massList[i];
positionList[i] += velocityList[i];
}
else {
printf("The entity is dead, Jim.\n");
}
}
}
Il mio problema con questa soluzione è che se dovessi avere un enorme elenco di entità, ad esempio 4M, durante questo ciclo, allora l'istruzione if (entityList [i] .isAlive == 1) avrebbe un impatto sulle prestazioni . C'è un'altra soluzione che rimuoverebbe questo collo di bottiglia? Forse uno che manterrebbe la matrice piacevole e confezionata senza "buchi" in essa?