General > German corner

Performance-Verlust mit cloneObject

<< < (2/3) > >>

EgonOlsen:
Alles klar. Gucke ich mir morgen mal an. Heute wird das vermutlich nichts mehr.

Telix:
Vielen Dank, dass du dir die Zeit nimmst! :) Evtl. findest du ja noch andere no go's von mir :D

EgonOlsen:
Also erstmal zwei kleine Anmerkungen zum Code an sich:

In WorldBlock würde ich den Konstruktor ersetzen durch:


--- Code: ---public WorldBlock(Object3D obj) {
super(obj, true);
this.shareCompiledData(obj);
}

--- End code ---

Das spart Speicher und rendert u.U. etwas schneller.

Und das Rückgängigmachen der Translation in WorldLevel geht so einfacher:


--- Code: ---WorldBlocks[y][x] = new WorldBlock(cache);
WorldBlocks[y][x].clearTranslation();

--- End code ---

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.

Telix:
ich cache aber nur die objekte die NUR hasUpper haben. Alle anderen lasse ich normal erzeugen.
Somit müsste es immer nur 2 Polys haben.? Oder habe ich ein Denkfehler?

EgonOlsen:

--- Quote from: Telix on November 25, 2013, 09:04:13 pm ---Oder habe ich ein Denkfehler?

--- End quote ---
Ich denke ja. Du cachst nicht nur die Objekte, die nur hasUpper haben...du erzeugst nur diese aus dem Cache. Im Cache sind aber auch solche, die durchaus mehr als hasUpper haben. Du müsstest dann eher sowas machen wie:


--- Code: ---WorldBlocks[y][x] = new WorldBlock(12);
if (_useCache && hasUpper && !hasLower && !hasFront && !hasLeft && !hasRight) {
    _cacheObjects.put(Blocks[y][x], WorldBlocks[y][x]);
}

--- End code ---

Sonst landet das erstbeste Objekt dieses Typs im Cache und das hat u.U. mehr als nur Upper.

Navigation

[0] Message Index

[#] Next page

[*] Previous page

Go to full version