01: /*
02: * $RCSfile: J3dClock.java,v $
03: *
04: * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved.
05: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
06: *
07: * This code is free software; you can redistribute it and/or modify it
08: * under the terms of the GNU General Public License version 2 only, as
09: * published by the Free Software Foundation. Sun designates this
10: * particular file as subject to the "Classpath" exception as provided
11: * by Sun in the LICENSE file that accompanied this code.
12: *
13: * This code is distributed in the hope that it will be useful, but WITHOUT
14: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16: * version 2 for more details (a copy is included in the LICENSE file that
17: * accompanied this code).
18: *
19: * You should have received a copy of the GNU General Public License version
20: * 2 along with this work; if not, write to the Free Software Foundation,
21: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
22: *
23: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
24: * CA 95054 USA or visit www.sun.com if you need additional information or
25: * have any questions.
26: *
27: * $Revision: 1.5 $
28: * $Date: 2008/02/28 20:17:25 $
29: * $State: Exp $
30: */
31:
32: package javax.media.j3d;
33:
34: /**
35: * Utility class to provide a more accurate replacement for
36: * System.currentTimeMillis().
37: */
38: class J3dClock {
39:
40: private static long deltaTime;
41: private static final long nsecPerMsec = 1000000;
42:
43: /**
44: * Private constructor, since no instance should ever be created.
45: */
46: private J3dClock() {
47: }
48:
49: /**
50: * Returns the current time in milliseconds. This is a more
51: * accurate version of System.currentTimeMillis and should be used in
52: * its place.
53: *
54: * @return the current time in milliseconds.
55: */
56: static long currentTimeMillis() {
57: return (System.nanoTime() / nsecPerMsec) + deltaTime;
58: }
59:
60: static {
61: // Call time methods once without using their values to ensure that
62: // the methods are "warmed up". We need to make sure that the actual
63: // calls that we use take place as close together as possible in time.
64: System.currentTimeMillis();
65: System.nanoTime();
66:
67: // Compute deltaTime between System.currentTimeMillis()
68: // and the high-res timer, use a synchronized block to force both calls
69: // to be made before the integer divide
70: long baseTime, baseTimerValue;
71: synchronized (J3dClock.class) {
72: baseTime = System.currentTimeMillis();
73: baseTimerValue = System.nanoTime();
74: }
75: deltaTime = baseTime - (baseTimerValue / nsecPerMsec);
76: }
77: }
|