threads in j3d?

Status
Nicht offen für weitere Antworten.
D

dragon3d

Gast
hi,

ich habe mich erst seit kurzem mit java und j3d beschäftigt.

ich müßte innerhalb meiner szene in j3d die zeichnung meines szenegraphen mit einer darauf zugreifenden klasse synchroniseren und bin dabei auf threads gestoßen.

kann man überhaupt in j3d threads nutzen und wie ist das möglich?

kann mir jemand einen guten tip, quelle oder ähnliches nennen?

danke im voraus.

dragon
 

Illuvatar

Top Contributor
Du kannst natürlcih Threads verwenden, Sun empfiehlt aber ausdrück lich die Verwendung von Behaviors. Du addest einen Behavior zu deinem BranchGraph, machst ihn live und setzt seine SchedulingBounds und machst eine WakeupCondition, z.B. dass er alle 5ms aufwachen soll. In der processStimulus-Methode kannst du dann beruhigt den SceneGraph verändern und musst dann die WakeupCondition resetten.

Siehe hier: http://www.java-forum.org/de/viewtopic.php?p=21408#21408, hier: http://java3d.virtualworlds.de/ j3d.pdf, oder hier: http://java.sun.com/products/java-media/3D/collateral/j3d_tutorial_ch4.pdf
 

Oxygenic

Bekanntes Mitglied
Illuvatar hat gesagt.:
Du kannst natürlcih Threads verwenden, Sun empfiehlt aber ausdrück lich die Verwendung von Behaviors.

Das ist so nicht ganz korrekt. Threads können frei verwendet werden, lediglich wenn der SceneGraph manipuliert werden soll (hinzufügen/entfernen von Elementen) sollen Behaviors verwendet werden. Ansonsten wären sie für die klassischen Aufgaben eines Threads recht wenig geeignet.
 
R

rietz

Gast
hallo,

das klingt interessant.

ich habe ein ähnliches problem. da das offscreen rendern nicht funktioniert hat, habe ich eine klasse geschrieben mit der man sobald der szenegraph neu gezeichnet wird diesen als bild abspeichern kann.

das problem: dies geschieht on-the-fly und nicht frame genau. deshalb hätte ich ja gerne gesagt: zeichne den szenegraphen, warte bis ich das bild abgespeichert habe und fahre dann wie gerade eben fort bis die animation beendet ist.

ich könnte das also mit behaviors tun. aber wie genau?

vielen dank für euerer interesse im voraus.
 

Illuvatar

Top Contributor
Afaik müsste das mit einem Behavior funktionieren, der mit einem WakeupOnElapsedFrames (0) aufwacht. Also so einer:

Code:
Behavior b = new Behavior(){
  WakeupCondition w = new WakeupOnElapsedFrames (0);
  public void initialize()
  {
    wakeupOn (w);
  }
  public void processStimulus (Enumeration criteria)
  {
    //Bild speichern
    wakeupOn (w);
  }
};
b.setSchedulingBounds (new BoundingSphere (new Point3d(), 1000));
// b live machen

Code nicht getestet, müsste aber gehen ;)
 
R

rietz

Gast
hallo Illuvatar,

das klingt viel versprechend. ich werde es umgehend testen.

grosses lob an das forum. hier wird sich wirklich bemüht zu helfen!

vielen dank.
 

Oxygenic

Bekanntes Mitglied
@rietz: damit wirst du nicht glücklich werden, da du in einem Behavior mit viel zu schnellen Events totgeworfen werden wirst und nicht nachkommst deine viel zu langsamen BufferedImages zu füllen.

Was ich nach wie vor nicht verstehe: wieso funktioniert dein Code nicht? Ob ich nun ein Frame exklusiv offscreen rendere oder mehrere, in dem ich das ganze Verfahren mehrfach verwende, ist doch völlig egal! Und wenn du einen Canvas3D auf off-screen-rendering eingestellt hast, rendert jeder Aufruf von renderOffScreenBuffer() exakt EINEN Frame. Jeder wiederholte Aufruf dann zwangsläufig den nächsten.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben