Problem mit Geschwindigkeit bei DirectX



  • Hallo

    Ich verwende DirectX und will mehrere 3d modelle darstellen. dabei bedine ich mich der klasse CD3DFile erstelle einen zeiger

    CD3DFile * lpXModell;
    

    und lade anschließend eine .x datei mit

    lpXModell=new CD3DFile();
    lpXModell->Load("modell.x");
    lpXModell->Scale(1.0f);
    

    ich zeige dann das modell auf dem bildschirm an und es sieht so aus wie ich mir das wünsche. alles klappt hervorragend.

    das problem ist wenn ich mehrere modelle auf den bildschirm bringen möchte. ca 100 modelle um genau zu sein. dazu erzeuge ich ein array

    CD3DFile * lpXModell[100];
    

    dann bekomme ich eine framerate von 8 und das programm wird elendlangsam. so jetzt frage ich mich ob das mit der klasse cd3dfile zu tun hat! oder ist es einfach heutzutage noch nicht möglich 100 modelle gleichzeitig auf dem bildschirm anzuzeigen? 😕 😡 ich verwende einen pentium 4 2200 mhz und ne ati also daran dürfte es nicht liegen! Auch sind die modelle nicht so komplex! Was könnte man machen?

    danke im voraus



  • SpaceMonkey schrieb:

    ich verwende einen pentium 4 2200 mhz und ne ati also daran dürfte es nicht liegen!

    Wenn, dann liegt es an der Grafikkarte.
    Aber Du machst da einen großen Fehler: Du solltest nicht für jedes der 100 Modelle eine neue Instanz von CD3DFile erstellen. Eine einzige für jede Modelldatei reicht doch. Du musst bedenken, dass ansonsten 100x dieselben Daten gespeichert werden, was sehr ressourcenfressend ist.
    Also das Modell einmal laden und dann einfach mit der World-Matrix an die verschiedenen Stellen setzen und rendern.



  • oh 🙄 ja da hast du recht! da hab ich mich beim fragen vertan. ich hab es schon so gemacht wie du es gesagt hast, also nur eine klasse erzeugt und es nur einmal geladen und halt an unterschiedlichen positionen angezeigt. jetzt habe ich versucht das modell weniger komplex zu halten und siehe da es geht. jetzt schaut das modell halt nicht mehr so gut aus. (naja so wunderschön war es vorher auch wieder ncicht). aber meine frage ist jetzt wie viele polygone ich verwenden darf dass es bei den meisten computern geht. gibts da ne formel? denn ich will nicht damit enden für eine figur einen quader verwenden zu müssen!!!



  • Du kannst auch verschieden detaillierte Versionen des Modells erstellen, z.B. 3 Stück. Wenn ein Objekt weiter weg ist, nimmst Du die Version mit den wenigsten Polygonen. Das nennt sich LOD (level of detail).



  • aaaaaaaaaaaaaaaaaaaaah! dankeshön



  • Und noch was wichtiges: Vor dem Rendern solltest Du testen, ob das Objekt überhaupt im Sichtbereich der Kamera liegt!



  • danke für den tipp. aber ich habe gedacht dass das die pipeline automatisch macht? und wie kann ich testen ob ein objekt in sichtfeld ist. ich kann doch nicht für jedes objekt dass ich auf dem bildschrim rendern will testen ob es im sichtfeld liegt. das wäre nämlich sehr umständlich.



  • SpaceMonkey schrieb:

    ich kann doch nicht für jedes objekt dass ich auf dem bildschrim rendern will testen ob es im sichtfeld liegt. das wäre nämlich sehr umständlich.

    Doch, klar, und der Test ist sogar ziemlich simpel. Entweder ziehst Du einen großen Quader oder eine große Kugel um das gesamte Objekt. Dann brauchst Du die sechs Ebenen des Kamera-Sichtbereichs. Bei einer Kugel setzt Du dann die Kugelposition in die Ebenengleichungen ein, und wenn das Ergebnis größer ist als der Radius, dann ist die Kugel auf der Außenseite einer der Ebenen und damit nicht sichtbar.
    Die Pipeline führt diese Tests nur auf Dreiecks-Ebene durch, d.h. auch bei einem Objekt, das völlig unsichtbar ist, werden für jedes Dreieck dieses Tests angestellt.



  • ich probiers mal! nochmals danke


Anmelden zum Antworten