2015-05-07 1 views
2

На моем джогле 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.

+0

Что такое startTime, объявленное как? – John

+2

С первого взгляда, похоже, у вас могут быть проблемы с потоками. Является ли текущая переменная объявленной изменчивой? Кроме того, в любое время работает доступ, я вижу шанс на несогласованность. Вы можете синхронизировать методы start() и stop(), чтобы убедиться, что это что-то изменит. –

+0

@John, так долго (я редактировал вопрос) – elect

ответ

1

Это может произойти, если фоновое задание обновляет время, возможно, в попытке исправить его для дрейфа.

Вы можете положиться на System.nanoTime, чтобы не отходить назад.

Цитирую System.nanoTime()

Возвращаемое значение представляет наносекунд с момента некоторого фиксированного, но произвольное время (возможно, в будущем, так что значения могут быть отрицательными).