На моем джогле sample у меня есть некоторые представления issue.Java, иногда я читал отрицательную разницу между двумя System.currentTimeMillis()
Я хотел бы прокомментировать его на стороне процессора, и я использую System.currentTimeMillis().
Это основной цикл моего приложения:
@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
является class, который имеет следующие методы:
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;
}
Как вы видите порядок вызова его методов .stop()
, .getTime()
, .reset()
и .start()
Someti mes, на .getTime()
случается, что возвращается отрицательное значение .. просто случайно без какой-либо схемы или что-то
Как это возможно?
Edit: Я сделал некоторые испытания на окнах 7 x64 (без volatile
, synchronized
и nanoTime()
), я не получаю никакого отрицательного дельта над там .. только на убунту 15,04 x64 ..
Во всяком случае, к сожалению, на Ubuntu volatile
и synchronized
не помогают, nanoTime()
вместо этого.
У вас есть правильное объяснение этому? Что-то не так с реализацией java? Я использую один из webupd8team, 8u45.
Что такое startTime, объявленное как? – John
С первого взгляда, похоже, у вас могут быть проблемы с потоками. Является ли текущая переменная объявленной изменчивой? Кроме того, в любое время работает доступ, я вижу шанс на несогласованность. Вы можете синхронизировать методы start() и stop(), чтобы убедиться, что это что-то изменит. –
@John, так долго (я редактировал вопрос) – elect