Programmfluss unterbrechen
-
Hallo,
ich arbeite an einem C++ Programm, dass die Simulation eines Modelles darstellen soll, d.h. ich habe ein Modell, welches eine Methode doSimulationStep hat und diese soll so lange ausgefuehrt werden, bis ein Abbruchkriterium eintritt. Desweiteren wuerde ich gern die Zwischenschritte jeweils auf dem Bildschirm anziegen lassen, also das Modell mittels drawModel zeichnen. Das ganze dann also in einer while Schleife wie folgt:
while(!Abbruchkriterium)
{
doSimulationStep;
DrwaModel;
}Das ganze laeuft auch super, nur leider dauert das zeichnen zu lange (das Modell ist relativ gross), d.h. die Simulation laeuft, ich seh aber nix - erst am Ende bekomm ich das fertig simulierte Modell gezeichnet.
Weiss vielleicht jmd, wie ich die Schleife so lange unterbrechen kann, bis DrawModell fertig ist? Ich habs schon mit einer festen Zeitangabe (sleep()) probiert, aber das geht nicht wirklich - das Programm ist dann kurz davor abzustuerzen und ich seh gar nix.
Fuer eine Idee oder einen Hinweise ware ich sehr dankbar!
Liebe Gruesse
j05y
-
Also... steh jetzt nur ich aufm Schlauch?
Fragen:
1.) Welche Graphic-API verwendest du? OpenGL? DirectX?
2.) Wie läuft das mit DrawModel()? Normal läuft eine Schleife erst weiter wenn die Funktionen fertig sind. Startet die Funktion DrawModels() nur einen Thread?
3.) Ist der Zeichencode vllt schuld? Hast du daran gedacht ein SwapBuffers o.ä. in DrawModels() einzubauen, damit der Backbuffer präsentiert wird (das Model also dargestellt wird)?
4.) Wie wird das Model gezeichnet? Einzeln die Vertices? Oder Arrays?Spontan: Du könntest die einzelnen Schritte die dargestellt werden vorher in DisplayLists (OpenGL) / Vertex Buffers o.ä. laden und dann diese aufrufen, bzw immer mehr davon in jedem Step. Das würde die Darstellung beschleunigen.
und 5.) Falsches Forum

rya.
-
ok ich habe wohl ein paar wenig infos geliefert, sorry. also:
ich arbeite mit VTK (www.vtk.org), ein toolkit welches c++ libraries fuer alle moeglichen graphischen anwendungen zur verfuegung stellt. die zeichen-methode zeichnet das modell direkt kante fuer kante (anders kann ich auf das modell nicht zugreifen). wenn ich die methode allein, einmalig aufrufe dauert das so ca. 8 sec. bis alles fertig gezeichnet ist, deshalb dachte ich auch, ich seh nix weil quasi das zeichnen durch das simulieren unterbrochen wird (das simulieren ohne zeichnen dauert pro schritt nur ca. 1 sec)
aber du hast natuerlich recht, die schleife laeuft eigentliche erst weiter, wenn das zeichnen beendet ist. also liegt das problem irgendwo anders.

an swapbuffers wie in OpenGL hab ich nicht gedacht, ich bin mir aber auch gar nicht sicher, ob VTK sowas ueberhaupt zur verfuegung stellt (VTK arbeitet ein Abstraktionsstufe hoeher als z.b. openGL).
danke erstmal fuer den hinweis.
-
Naja, da du sagtest, dass du das Model erst am Ende zu sehen bekommst, tipp ich ganz stark drauf, dass hier zwischendrin der Buffer nicht präsentiert wird.
Ich kenne jetzt VTK auch nicht, du solltest vllt da mal nachschauen, obs da ne Möglichkeit gibt.
rya.
-
Bei den meisten Grafikframeworks gibts eine Funktion die aufgerufen wird (von dir oder vom framework selber) damit was auf dem Bildschrim gezeichnet wird. Wenn du nur in deiner Schleife bist und die Funktion dabei nicht aufgerufen wird, dann passiert auch nix.
-
ich glaube das kann es nicht sein. meine draw-funktion rendert am ende das bild neu (also sowas wie das aeqivalent zu swapBuffer)und wenn ich sie einzeln aufrufe klappt auch alles, nur es dauert halt seine zeit.
ich denke eher, dass irgendwo auf dem weg vom programmcode zum fertig sichtbaren bild auf dem bildschirm zu viel zeit benoetigt wird. ich weiss aber leider nicht wo genau?!?!
-
Das kann dir hier ohne den COde zu kennen, kaum einer beantworten.
Frage:
Von wo lädst du das Model? Aus einer Datei? Lädst du das auch vorher? Oder während es gezeichnet wird als Stream?
Ansonsten musst du wirklich deine Render-Funktion Schritt für Schritt durchgehen und vllt mal Zeiten messen, zwischen den einzelnen Schritten und loggen. Das kann sehr aufschlussreich sein.
rya.
-
Nach einem kurzen Besuch auf der Homepage des Toolkits kommt mir der Verdacht, dass das Toolkit nicht für den Echtzeitbetrieb konzipiert ist. Es visualisiert komplexe mathematische und geometrische Gegebenheiten.
Wenn du also mehrere Simulationsschritte (Zeitschritte) simulieren und visualisieren willst, kommst du um ein PreRendering wohl nicht herum (Renderausgabe in mehrere Grafiken oder gleich ein komprimiertes Video-Format).
Grüße... Heiko
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Rund um die Programmierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.