Zusammenfügen von Shapes

Nocana

Mitglied
Ich habe eine Software entwickelt, welche GDS-Dateien visualisiert. Es kann nun vorkommen, dass hier sehr, sehr viele Shapes visualisiert werden müssen (in einer meiner Beispiel-Dateien sind es 1,8 Millionen Shapes).

Beim Zoomen habe ich nun das Problem, das es sehr langsam wird. Wie ich herausgefunden habe, liegt es hauptsächlich gar nicht am Zeichnen, sondern eher an den vielen zu berechnenden affinen Transformationen, welche fürs Zoomen benötigt werden.

Gibt es eine Möglichkeit, mehrere Shapes zu einem Shape zusammenzufügen, so dass ich dann nur noch eine Transformation machen müsste?

Hier ist mein Code-Abschnitt:

Java:
for (Shape shape : shapes)
{
    shape = gdsTransform.createTransformedShape(shape);
            
    if (shape.intersects(getVisibleRect()))
    {
        g2.draw(shape);
    }
}
 
Also das Transformieren an sich ist das aufwändige? Intersects ist auch nicht umsonst, ich frag' nur...
Ob das durch ein Zusammenfügen besser wird, hängt davon ab, was "Zusammenfügen" heißt: 100 disjunkte Shapes in ein Shape zu packen (das dann 100 disjunkte Zusammenhangskomponenten enthält) dürfte nicht viel bringen. Grundsätzlich kann man aber mit Area (Java Platform SE 6) die ganzen CSG-Operationen (add, subtract, or...) auf Shapes durchführen.
 
Danke für eure antworten.

@Marco: Was würdest du empfehlen? Ich weiß nicht wirklich, wie ich es verbessern könnte. Wenn du glaubst, dass es eher am intersects liegt, was könnte ich sonst machen? Wollte damit nur erreichen, dass keine sowieso unsichtbaren Strukturen ins leere gezeichnet werden, um Rechenzeit zu sparen.

@Andre: Falls du das meinst, was ich glaube:
Wenn ich das Graphics-Object transformiere, dann hole ich die tatsächlichen Strukturen nicht wirklich heran, sondern vergrößer sie nur.
Das hätte dann bei sehr starken Vergrößerungen die Folge, dass zB sehr sehr kleine Quadrate, welche im Originalgröße nur wie Punkte aussehen, in Vergrößerter Form nur Punkte bleiben. Und das sollte nicht sein, da sonst die Vergrößerung die Originalstrukturen falsch darstellt.
 
Zuletzt bearbeitet:
Das Intersects macht Graphics intern schon automatisch (und wahrscheinlich schneller, als wenn man's manuell macht). Hast du Andrés Tipp ausprobiert?
 
Das Intersects macht Graphics intern schon automatisch (und wahrscheinlich schneller, als wenn man's manuell macht). Hast du Andrés Tipp ausprobiert?

OK, dass Graphics das automatisch schon macht, wusste ich nicht. Das heißt also, wenn ich ein Shape ins leere zeichne, wird keine zusätzliche Rechenzeit fürs Zeichnen verbraucht?

Also ich habe jetzt mal sowohl die intersect-Befehle rausgeschmissen, als auch Andres Tipp ausprobiert. Das Zoomen bzw. Neuzeichnen der Strukturen dauert immer noch sehr sehr lange (und außerdem werden die Strukturen tatsächlich bei sehr nahem heranzoomen verfälscht dargestellt, wenn ich das Graphics-Objekt anstelle der Shapes transformiere).

Also, da es trotzdem noch langsam ist, auch wenn ich nur eine Transformation mache, weiß ich nun gar nicht mehr, wo ich den Hebel ansetzen könnte 🙁

Das Problem ist halt, dass es sich, wie schon gesagt, um 1,8 Millionen Shapes handelt, die ich hier auf ein Panel zeichne. Es handelt sich um viele kleine Strukturen, die teilweise sehr dicht beieinander liegen und bei Vollbild sogar (zumindest für den Betrachter) quasi übereinander liegen (eben weil sie so extrem dicht beieinander sind). Ich weiß aber leider nicht, wie ich ausschließen kann, dass viele sinnlose Shapes gezeichnet werden.

Was ich auch komisch finde: Selbst wenn ich sehr nah heranzoome, so dass eigentlich nur noch vielleicht 5-6 Shapes gezeichnet werden müssen (meistens nur einfache Linien), ist das Zeichnen immer noch extem langsam. Deswegen dachte ich, dass das Problem wohl darin liegt, dass hier trotz der nur 5-6 zu zeichnenden Shapes immer noch an 1,8 Millionen Shapes rumgerechnet wird.

Eine Lösung für das Problem fällt mir aber immer noch nicht ein :/
 
Hallo Nocana!

Also deine Vermutung, dass trotzdem die 1,8 Millionen Shapes gezeichnet werden ist schon sehr richtig.
Stand vor ein paar Wochen vor genau dem selben Problem und auch die vorgefertigten clip-Methoden erreichen nicht, dass überflüssiges nicht gezeichnet wird (evtl hatte ich clip auch falsch verstanden).

Auf jedenfall macht Graphics das nicht automatisch...
Ich habs einfach selber implementiert und "berechne" sozusagen, ob das zu zeichnende Shape im sichtbaren Bereich liegt und zeichne es erst dann. Spart extrem(!) viel Zeit beim zeichnen.

Ja ich weiß, der Thread ist schon älter, aber ich denke das Problem könnte öfter jemand haben, und dann findet er hier auch eine Lösung ;-)

LG Simon
 

Neue Themen


Zurück
Oben