# Canvas3D und setXORMode und Vista



## MikeM (25. Okt 2007)

Hallo,
ich entwickle ein kleines CAD-System mit Java3D. Auf meinem alten PC (Windows XP) funktioniert es auch problemlos. Unter Windows Vista hängt das Fadenkreuz, weil das Zeichnen mit Graphics2D und der XOR-Methode sehr langsam ist.

Ich verwende die JDK 1.6 und Java3d 1.5

Weise ich dem Canvas3D kein SimpleUniverse zu, ist die Geschwindigkeit OK. 



```
import java.awt.*;
import javax.swing.*;

import javax.media.j3d.*;

import com.sun.j3d.utils.universe.*;

@SuppressWarnings("serial")
public class myTestFrame extends JFrame 
{
   protected SimpleUniverse universe = null;
   private Canvas3D cadPanel = null;
   private Point crossHairPosition = new Point();
   private boolean crossHairIsVisible = false;   
   
   public myTestFrame() 
   {
	 cadPanel = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
	 universe = new SimpleUniverse(cadPanel);
	 universe.addBranchGraph(new BranchGroup());
	 
	 cadPanel.setBackground(Color.black);	
	 cadPanel.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() 
	 {
	   public void mouseMoved(java.awt.event.MouseEvent e) 
	   {
		 cadPanel_mouseMoved(e);
	   }
	 });  
	 
	 this.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
	 this.getContentPane().add(cadPanel);
	 this.addWindowListener(new java.awt.event.WindowAdapter() 
	 {
	    public void windowClosing(java.awt.event.WindowEvent e) 
	    {
	      System.exit(0);
		}
	 });	 
   }


   public static void main(String[] args)
   {
 	myTestFrame instance = new myTestFrame();
 	instance.setSize(600, 400);
 	instance.setVisible(true);
   }	
   
   private void cadPanel_mouseMoved(java.awt.event.MouseEvent e)
   {
 	 if (crossHairIsVisible) drawCrossHair();
 	
  	 crossHairPosition.x = e.getX();
 	 crossHairPosition.y = e.getY();
 	
 	 drawCrossHair();
   }  
   
   public void drawCrossHair()
   {
 	 Graphics2D g2d = (Graphics2D) cadPanel.getGraphics();
 	 g2d.setXORMode(Color.white);
 	
 	 g2d.drawLine(crossHairPosition.x, crossHairPosition.y-20, 
 	  		      crossHairPosition.x, crossHairPosition.y+20);
 	 g2d.drawLine(crossHairPosition.x-20, crossHairPosition.y, 
 		          crossHairPosition.x+20, crossHairPosition.y);	
 	
 	 crossHairIsVisible = !crossHairIsVisible;  
   }    
}
```

Ist das ein Problem von Windows Vista?
Oder gibt es eine Einstellung, die man vornehmen muss?

Vielen Dank und viele Grüße

MikeM


----------



## Evil-Devil (25. Okt 2007)

Nutzt du OpenGL oder Direct3D bei Java3D unter Vista?
OpenGL ist unter Vista ohne passenden Treiber sehr langsam.


----------



## MikeM (25. Okt 2007)

Danke für die schnelle Antwort.

Ich glaube ich verwende OpenGL, da ich beim Starten keine Optionen angebe.
Wie kann ich Direct3D einstellen? 

MikeM


----------



## Evil-Devil (25. Okt 2007)

Gute Frage, vermutlich als Startparameter. Da werden die Java3Dler dir mehr helfen können. Ich nutz nur LWJGL.


----------



## MikeM (25. Okt 2007)

Den Startparmeter für Direct3D habe ich gefunden (java -Dj3d.rend=d3d)
Die Geschwindigkeit wird nicht besser.
Meinen Grafikkartentreiber (NVIDIA) habe ich auch aktualisiert. Ebenfalls ohne Erfolg.

MikeM


----------

