Java3D performance issue on Win2000

Hello everyone,

I have been experiencing performance issues with J3D when ran on win2000. When win2k first came out, we installed it on one of our workstations that had a Fx6 video card, 768MB ram, and dual 733 processors. This system came with NT 4.0 r5 and performed very well when we tested it using our Java/Java3D engines and viewers. We then decided to install Win2k on it for testing purposes. Unfortunately, the results where terrible. Regardless of screen resolution and color depth our apps ran at ONLY 2 Hz . Among the many things we tried, we made sure we had the latest video drivers and . . . . But we did not have any luck.

Couple of my last students had installed win2k on their home PCs, and had experienced very poor performance when running one of our Java/Java3D based Game Engines. I made a slight change to HelloUniverse.java in order to make it print out frame rates when running. This app (which I have attached to this message) runs at about 110htz on one of our workstations (the configuration that I described above, and NT 4.0) fullscreen @ 1280x1024 and 32 bit color depth ( ~1600 Htz when it runs in its default 256x256 window ). I do get acceptable frame rate on any pc (win98 or NT) that has a good video card. I sent this app to my students who have windows 2000 and they ALL got very low frame rate. They all confirmed that when they go to full screen the frame rate locks to 2 Htz !! these guys have different type of PCs with very good video cards (most of them have Gforce chipsets). To top this off, one of my students who got very poor frame rate with this helloUniverse app and all Sample Behaviors for the engine that I have gave them (behaviors written in cpp that use my JNI wrapped methods to call the java side of the engine) told me that ONE of the project (written for the engine that I described) runs at a SURPRISING 35htz (Full screen, 1024x768, 32 bit color depth) , but rest of the projects and any of the "java3d Demos" runs at 2htz !!! Unfortunately, I have not been able to come to any conclusions regarding the 35htz frame rate but either way all of these PCs have issues with J3D (again on win2k, we made sure they ALL have latest video drivers)

I would like to know if any you are running J3D on win2k with acceptable performance. I suggest downloading the attached files, and noting the frame rate that you get at full screen. (compile the two .java files and then launch HelloUniverse.  HelloUniverse will attack an instance of FramesPerSecondBehavior to the scene)

(my students have told me that @ the default 256x256 window, they get ~ 30 Hz, But when the go full screen it drops to 2. Another friend of mine told me that REGARDLESS of what resolution, color dept, or windows size, ALL java3D Demos run @ 18 Hz)

Thank you for any suggestions or help,

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 Syrus Mesdaghi             Full Sail Real World Education
 3D Gaming Instructor     3300 University BLVD
 [EMAIL PROTECTED]   Winter Park FL 32792
                                        http://www.fullsail.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

 


import java.util.* ;
import javax.media.j3d.*;

public class FramesPerSecondBehavior extends Behavior {

        private static FramesPerSecondBehavior instance = new FramesPerSecondBehavior();

        private WakeupCondition         wakeupCondition;
        private WakeupCriterion         wakeupCriterion;
	
        int             frameCount  = 0;
        long    time            = 0;
	

        private FramesPerSecondBehavior(){}
	
        public static FramesPerSecondBehavior getInstance(){
                return instance;
        }

	
	
        public void initialize(){
                wakeupCriterion = new WakeupOnElapsedFrames(0);
                wakeupOn( wakeupCriterion );
        }
	

        public void processStimulus(Enumeration criteria){
                	
                if (frameCount++ == 1)
                        time = System.currentTimeMillis();
                	
                if (frameCount == 50){
                        float delta =(float)(System.currentTimeMillis() - time)/1000;
                        float fps = frameCount/delta;
                        System.out.println(">> Fps: " + fps + " Hz");
                        frameCount = 0;
                }	
	
                wakeupOn( wakeupCriterion );                            	
        }	
}
/*
 *  @(#)HelloUniverse.java 1.48 00/02/10 13:14:09
 *
 * Copyright (c) 1996-2000 Sun Microsystems, Inc. All Rights Reserved.
 *
 * Sun grants you ("Licensee") a non-exclusive, royalty free, license to use,
 * modify and redistribute this software in source and binary code form,
 * provided that i) this copyright notice and license appear on all copies of
 * the software; and ii) Licensee does not utilize the software in a manner
 * which is disparaging to Sun.
 *
 * This software is provided "AS IS," without a warranty of any kind. ALL
 * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
 * IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
 * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE
 * LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
 * OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS
 * LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
 * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
 * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
 * OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGES.
 *
 * This software is not designed or intended for use in on-line control of
 * aircraft, air traffic, aircraft navigation or aircraft communications; or in
 * the design, construction, operation or maintenance of any nuclear
 * facility. Licensee represents and warrants that it will not use or
 * redistribute the Software for such purposes.
 */

import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.event.*;
import java.awt.GraphicsConfiguration;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.geometry.ColorCube;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.vecmath.*;

public class HelloUniverse extends Applet {
    public BranchGroup createSceneGraph() {
    // Create the root of the branch graph
    BranchGroup objRoot = new BranchGroup();

    // Create the transform group node and initialize it to the
    // identity.  Enable the TRANSFORM_WRITE capability so that
    // our behavior code can modify it at runtime.  Add it to the
    // root of the subgraph.
    TransformGroup objTrans = new TransformGroup();
    objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
    objRoot.addChild(objTrans);

    // Create a simple shape leaf node, add it to the scene graph.
    objTrans.addChild(new ColorCube(0.4));

    // Create a new Behavior object that will perform the desired
    // operation on the specified transform object and add it into
    // the scene graph.
    Transform3D yAxis = new Transform3D();
    Alpha rotationAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE,
                    0, 0,
                    4000, 0, 0,
                    0, 0, 0);

    RotationInterpolator rotator =
        new RotationInterpolator(rotationAlpha, objTrans, yAxis,
                     0.0f, (float) Math.PI*2.0f);
    BoundingSphere bounds =
        new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
    rotator.setSchedulingBounds(bounds);
    objTrans.addChild(rotator);

	/***
       *  add FramesPerSecondBehavior to the tree and setSchedulingBounds
       ***/
    objRoot.addChild(FramesPerSecondBehavior.getInstance());
    FramesPerSecondBehavior.getInstance().setSchedulingBounds(bounds);
    
        // Have Java 3D perform optimizations on this scene graph.
        objRoot.compile();

    return objRoot;
    }

    public HelloUniverse() {
    setLayout(new BorderLayout());
        GraphicsConfiguration config =
           SimpleUniverse.getPreferredConfiguration();

    Canvas3D c = new Canvas3D(config);
    add("Center", c);

    // Create a simple scene and attach it to the virtual universe
    BranchGroup scene = createSceneGraph();
    SimpleUniverse u = new SimpleUniverse(c);

        // This will move the ViewPlatform back a bit so the
        // objects in the scene can be viewed.
        u.getViewingPlatform().setNominalViewingTransform();
        

    u.addBranchGraph(scene);
    }

    //
    // The following allows HelloUniverse to be run as an application
    // as well as an applet
    //
    public static void main(String[] args) {
    new MainFrame(new HelloUniverse(), 256, 256);
    }
}

Reply via email to