# threads in j3d?



## dragon3d (18. Mai 2005)

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 (19. Mai 2005)

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 (19. Mai 2005)

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.


----------



## rietz (19. Mai 2005)

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 (19. Mai 2005)

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


```
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


----------



## rietz (19. Mai 2005)

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 (19. Mai 2005)

@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.


----------

