Multithreading?



  • Hey,

    Ich arbeite nun schon länger mit OpenGL und wüsste mal gerne, wie man am sinnvollsten Multithreading nutzt. Also viel mehr meine ich wo man es einsetzen kann ^^

    Mir erscheint es z.B. Sinnvoll, einen Thread für die Kollisionsberechnung zu benutzen, da dort ja doch ein paar mathematischen Operationen abgearbeiteten werden. Allerdings hatte ich dabei in der Vergangenheit Probleme. Die Sachen liefen dann nicht mehr wirklich syncron ab und es folgen Darstellungsfehler.



  • OpenGL Calls sollten nur aus dem Mainthread erfolgen.
    Berechnungen kannst du natürlich threaden, aber du solltest das halt auch synchronieren.
    Allgemeine Antwort, aber deine Frage war auch nicht sehr spezifisch :p.



  • OpenGL _) schrieb:

    Also viel mehr meine ich wo man es einsetzen kann ^^

    Überall dort wo Berechnungen ausgeführt werden müssen und gleichzeitig das eigentliche Programm weiterlaufen soll.
    Z.B. Ladebildschirme, Speichern von Daten, etc...


  • Mod

    mit opengl hat das nciht viel zu tun, da die allermeisten opengl aufrufe fast keine zeit kosten, und falls doch, dann wartet man auf die graphikkarte und dann macht es keinen sinn dass mehrere threads warten wuerden.

    entsprechend musst du woanders threads verwenden, wenn du wirklich 0 ahnung davon hast, kannst du viel kaputt machen, wie du scheinbar am eigenen leib gespuert hast. fuer diesen fall bietet es sich an vielleicht openMP zu nutzen, das kann dir ein wenig arbeit abnehmen, z.b. einen loop zu parallelisieren, alle daten innerhalb des loops pro thread zu instanzieren und am ende alles zu synchronisieren.
    du musst dennoch oft drauf achten, dass nirgens daten von zwei threads gleichzeitig modifiziert werden bzw dass kein thread daten benutzt die im anderen thread modifiziert werden koennten.

    bei collision detecion is das recht gut machbar z.b.

    #pragma omp parallel for
    for(a = 0 to anzahl_objekte-1)
    for(b = a+1 to anzahl_objekte)
    {
     collisions_punkt=collision(a,b);
     if(collisions_punkt.valid())
     {
      #pragma omp critical
      {
       collisions_list.push_back(collisions_punkt);
      }
     }
    }
    

    (natuerlich nur pseudo code beispiel)



  • Du könntest neben den klassischen Anwendungen, wie Laden und Speichern z.B. Pathfinding durchführen oder die Collision für den nächsten Frame berechnen.
    Wichtig ist, dass du nicht an Stellen schreibst, die gerade gelesen, z.B. gerendert werden können.

    Beim Laden könntest du es auch so machen, dass du komprimierte Daten mit Threads einliest, z.B. könntest du Bilder (png etc) in einem Thread laden und dekomprimieren, in einem anderen die Meshes laden.

    Du solltest aber vorsichtig sein, denn dabei können leicht Bugs entstehen.


Anmelden zum Antworten