Also erstmal zwei kleine Anmerkungen zum Code an sich:
In WorldBlock würde ich den Konstruktor ersetzen durch:
public WorldBlock(Object3D obj) {
super(obj, true);
this.shareCompiledData(obj);
}
Das spart Speicher und rendert u.U. etwas schneller.
Und das Rückgängigmachen der Translation in WorldLevel geht so einfacher:
WorldBlocks[y][x] = new WorldBlock(cache);
WorldBlocks[y][x].clearTranslation();
Jetzt aber zum Performanceproblem. Ich habe eine Weile gesucht...ich denke, es liegt daran, dass deine Objekte aus dem Cache teilweise komplexer sind als die, die du neu erstellst. Wenn du neue erstellst, wertest du hasRight, hasLeft usw. aus und erzeugst nur bei Bedarf die entsprechenden Polygone. Wenn du aber immer das gecachte Objekt des jeweiligen Typs nimmst, dann erwischt du das erste erstellte. Und wenn das bei hasRight usw. false hatte, dann hat das Polygone an Stellen, wo dein neu erzeugtes gar keine hätte. Das siehst du auch den Meldungen des ObjectCompilers. Die neu erstellten haben ganz oft 6 Polygone und kompilieren in ein Teilobjekt wo die aus dem Cache 12 Polygone haben und in 2 Teilobjekte kompiliert werden.