On a jogl sample of mine, I am having some performances issue.
I would like to profile it on the cpu side and I am using System.currentTimeMillis().
This is the main loop of my application:
@Override
public void display(GLAutoDrawable glad) {
frameTimer.stop();
frameDelta = frameTimer.getTime();
// just an estimate
totalTime += frameDelta;
transformer.update(frameDelta);
frameTimer.reset();
GL4 gl4 = glad.getGL().getGL4();
frameTimer.start();
draw(gl4);
checkGlError(gl4);
glad.swapBuffers();
}
frameDelta is a class that has the following methods:
private long startTime;
private long diffTime;
private boolean running;
public NvStopWatch() {
running = false;
}
/**
* Start time measurement.
*/
public void start() {
startTime = System.currentTimeMillis();
running = true;
}
/**
* Stop time measurement.
*/
public void stop() {
diffTime = getDiffTime();
running = false;
}
/**
* Reset time counters to zero.
*/
public void reset() {
diffTime = 0;
if (running) {
start();
}
}
public float getTime() {
float ms = running ? getDiffTime() : diffTime;
return ms / 1000;
}
/**
* Get difference between start time and current time.
*
* @return
*/
private long getDiffTime() {
long now = System.currentTimeMillis();
long diff = now - startTime;
if (diff < 0) {
System.out.println("diff " + diff + " now " + now + " startTime " + startTime);
diff = (long) BindlessApp.minimumFrameDeltaTime;
}
return diff;
}
As you see the calling order of its methods is .stop(), .getTime(), .reset() and .start()
Sometimes, on the .getTime() it happens that a negative value is returned.. just randomly without any schema or something
How could it be possible?
Edit:
I did some test on windows 7 x64 (without any volatile, synchronized and nanoTime()), I dont get any negative delta over there.. only on ubuntu 15.04 x64..
Anyway unfortunately on Ubuntu volatile and synchronized don't help, nanoTime() instead does.
Do you have a valid explanation to that? Something wrong with the java implementation? I am using the one of webupd8team, 8u45.