Performance Picking Selecting



  • Hi, hab ein LegoModel geladen, welches ca 3000 Steine hat
    ohne DisplayListe und VertexBuffer Arrays bekomme ich eine halbwegs flüssige Darstellung hin.

    Nun möchte ich die Steine auswählen
    laufe also die Liste durch, in denen die Steinen drin sind und setze ein Flag dass der Stein selectiert ist.

    Die Liste wird erneut durchgelaufen, nun in der draw Methode un der Stein wird in einer anderne Farbe z.b. Rot gezeichnet.

    Das selektieren geht schnell aber das reDraw dauert ewig also mit der Maus über das Modell gleiten 2 Sekunden warten dann wird der Stein farbig angezeigt

    wie gehts so was schneller?
    kann doch nicht sein dass ich da immer 2 Sekunden warte?



  • Ohne Code ist das schwer zu sagen...Aber Picking braucht bei 3000 Steinen zu je (wieviele sinds denn?) Primitives sicher einige Zeit..

    Aber wie gesagt: Ohne Code, ohne Information über die SW die du benutzt und ohne genaue Beschreibung ist das eher Raten



  • ein paar stichworte, die weiterhelfen könnten, von allgemein zu speziell: "teile und herrsche", spatial subdivision, octree.



  • powerblow schrieb:

    ein paar stichworte, die weiterhelfen könnten, von allgemein zu speziell: "teile und herrsche", spatial subdivision, octree.

    Absolutes muss für statischen Inhalt. Da kannst du das auf nichts reduzieren. 😉



  • Also ich lade die Datfiles welche Kordinaten enthalten in dynamische arrays vom Typ std::vector
    das alles passiert in einer Klasse Brick
    Brick enthältalle Geometriedaten strukturiert
    und hat Methoden z.B. isClicked und draw

    eine weitere Klasse Scene verwaltet die Bricks
    in einer einfach verketteten Liste vom Typ std::list
    Die Liste wird in der OpenGL Draw Methode mit einem Iterator durchgelaufen
    und zeigt jeweils auf einen Stein in der Liste und zeichnet diesen

    sobald ich mit der Maus drüberfahre erkennt GLUT dies durch die passiveMotion funktion der Maus - diese ruft die Funktin picking auf welche mir einen wert liefert welcher stein getrffen wurde
    nun laufe ich die liste wieder durch lasse mir die IDs gebe der steine prüfe nach und zeige auf den Stein der ausgewählt wurde und setze ihn auf clicked!

    in der draw Methde zeichne ich die geklickten anders

    kann man da etwas performanter machen?
    bzw optimieren?

    hab halt viele for schleifen im code



  • Verstehe ich das richtig, dass du nicht ständig renderst? - Also nur neu renderst, wenn es eine Änderung gegeben hat?

    Zuersteinmal würde ich empfehlen das ganze auf Release zu stellen (falls du das noch nicht hast, dann fällt nämlich die ganze STL Balast weg).

    Anderseits finde ich es komisch, dass du zuerst den Hittest machst und dann alles nochmal durchlaufen musst. Da kannst du dir ja gleich einen Zeiger auf das Objekt bekommen und dann über den Zeiger das Objekt verändern.



  • ja selbst mit stl-debug-ballast sollte es ein klacks sein 3000 steine durchzuiterieren
    selbst bei 3.000.000 Elementen sollte es keine 2sec dauern.

    Auch das rendern sollte von 3000 Steinen sollte keine 2 sec dauern.

    Wie MatthiasA auch schon sagt, ich kann mir nicht vorstellen, dass der hittest nur eine ID gibt, weil das ja hoch unpraktikabel wär, es sein denn die Engine bietet eine Möglichkeit diese ID sehr komfortabel in einen Pointer umzuwandeln.



  • vlad_tepesch schrieb:

    ja selbst mit stl-debug-ballast sollte es ein klacks sein 3000 steine durchzuiterieren
    selbst bei 3.000.000 Elementen sollte es keine 2sec dauern.

    Auch das rendern sollte von 3000 Steinen sollte keine 2 sec dauern.

    2 sec sind zu viel, wenn deine Applikation sonst mit >1000 Frames/Sekunde läuft. 😉
    Im Debug Modus ist die STL bei mir normalerweise Bottleneck Nr 1. Da da halt sehr viel drüber läuft. Ist ja aber auch kein Problem.. Ich sage es nur, weil es schon recht viel ausmacht, wenn man da mal von Debug auf Release schaltet. Und man zuerst mal da schauen sollte, ob es das war.



  • hab schon von Debug auf Release gestellt.

    es sind 3000 Legosteine in einer <list> das sind 1,4 Millionen Polygone
    Mein Programm zeigt mir er auf meiner Ati X1400 256mb Mobility 3,5fps an
    die Zeit zwischen dem Picken ist 1,5 Sekunden
    es wird immer alles neu gerendert sobald die Maus bewegt wird

    Leider kann ich nicht beim picken direkt auf das Objekt zeigen
    weil die ja in einer stl Liste sind
    wäre da eine Map besser?

    sollte das schneller gehen?

    Gruß Matthias



  • vlad_tepesch schrieb:

    ja selbst mit stl-debug-ballast sollte es ein klacks sein 3000 steine durchzuiterieren
    selbst bei 3.000.000 Elementen sollte es keine 2sec dauern.

    Auch das rendern sollte von 3000 Steinen sollte keine 2 sec dauern.

    Wie MatthiasA auch schon sagt, ich kann mir nicht vorstellen, dass der hittest nur eine ID gibt, weil das ja hoch unpraktikabel wär, es sein denn die Engine bietet eine Möglichkeit diese ID sehr komfortabel in einen Pointer umzuwandeln.

    3.000.000 steine zu je 466 Polygonen die alle beim Picking mit berechnet werden wollen...
    Ich denke dass das sicher ne Weile brauchen würde - vorallem wenn man nicht den schnellsten Rechner hat

    EDIT:
    Wie sieht dein Picking aus?
    Strahl mit Polygon? oder eher strahl mit Box?


Anmelden zum Antworten