Je suis en train de créer un jeu WebGL et j'ai tellement avancé que j'ai commencé à chercher des goulots d'étranglement au niveau des performances. Je peux voir qu'il y a beaucoup de petites baisses de FPS quand il y a des GC en cours. J'ai donc créé un petit gestionnaire de pool de mémoire. Je vois encore beaucoup de GC après avoir commencé à l'utiliser et je soupçonne que j'ai quelque chose de mal.
Le code de mon pool de mémoire ressemble à ceci :
function Memory(Class) {
this.Class = Class;
this.pool = [];
Memory.prototype.size = function() {
return this.pool.length;
};
Memory.prototype.allocate = function() {
if (this.pool.length === 0) {
var x = new this.Class();
if(typeof(x) == "object") {
x.size = 0;
x.push = function(v) { this[this.size++] = v; };
x.pop = function() { return this[--this.size]; };
}
return x;
} else {
return this.pool.pop();
}
};
Memory.prototype.free = function(object) {
if(typeof(object) == "object") {
object.size = 0;
}
this.pool.push(object);
};
Memory.prototype.gc = function() {
this.pool = [];
};
}
J'utilise ensuite cette classe comme ceci :
game.mInt = new Memory(Number);
game.mArray = new Memory(Array); // this will have a new push() and size property.
// Allocate an number
var x = game.mInt.allocate();
<do something with it, for loop etc>
// Free variable and push into mInt pool to be reused.
game.mInt.free(x);
Ma gestion de la mémoire pour un tableau est basée sur l'utilisation de myArray.size au lieu de length, ce qui permet de garder la trace de la taille actuelle réelle du tableau dans un tableau surdimensionné (qui a été réutilisé).
Donc, pour ma question actuelle :
Cette approche permet d'éviter la GC et de conserver la mémoire pendant le jeu. Les variables que je déclare avec "var" à l'intérieur des fonctions seront-elles toujours GC même si elles sont retournées en tant que new Class() depuis ma fonction Mémoire ?
Ejemplo:
var x = game.mInt.allocate();
for(x = 0; x < 100; x++) {
...
}
x = game.mInt.free(x);
Est-ce que cela entraînera toujours la collecte de la mémoire de la "var" en raison d'une copie de la mémoire dans les coulisses ? (ce qui rendrait mon gestionnaire de mémoire inutile).
Mon approche est-elle bonne/pertinente dans mon cas avec un jeu pour lequel j'essaie d'obtenir des FPS élevées ?