Hello all,
I)
I've been trying to use  view.setMinimumFrameCycleTime(  ) to set the frame rate in game engine that we have written, but I haven't been able to get satisfying results.  I wrote a small behavior that demonstrates this problem:
 
 here are the results of my test app: 
 
  ms        fps       should be
------    --------    ---------
100 ms      ~9.5         10
 50 ms     ~16.6         20           
 20 ms     ~33.3         50
 10 ms     ~66.6        100
 
As you will be able to see in FramesPerSecondBehavior.java  I get the avarage frame rate over 50 frames. 
 
II)
In addition, my other concern is that even if this method works properly, I wont able to set the frame rate to lock at 30 or 60 Hz because the parameter that I have to pass in the method is of type "long" and not double/float. Take the following case as an example:
 
  ms        fps   
------    --------
16.67       60     (since the argument needed is a "long" we cannot use 16.67)            
16          62.5   (if we round down or up, the resulting frame rates are unreasonably off)
17          58.82  
 
In visual simulations, locking to a certain frame rate is considered a standard feature, and in gaming, this problems can cause difficulty when trying to add frame-based intergrations such as animation sequences, etc.
 
 
please let me know if the timing problem (1st section of this e-mail) is a known bug or if there is a work arroud. I am also wodering if there is any plans regarding fixing setMinimumFrameCycleTime() inaccuracies (such as being able to set cycle time in microsecond's instead of milisecond's).  
 
 
----------------------------------------------------------------------------------------------
Syrus Mesdaghi                          Full Sail Real World Education
3D Gaming Course 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.0f);///(long)100.0;
                        float fps = ((float)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);

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