package net.onedaybeard.dominatrix.util; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.utils.Pool; public final class NTimer { public static final String TAG = NTimer.class.getSimpleName(); private static Factory factory = new Factory(); private long total; private long lastStart; private int runs; private boolean running; private NTimer() { reset(); } public void start() { if (running) { Gdx.app.error(TAG, "Timer already started"); } else { running = true; runs++; lastStart = System.nanoTime(); } } public void stop() { total += System.nanoTime() - lastStart; running = false; } public void reset() { total = 0; runs = 0; running = false; } public static void free(NTimer object) { factory.free(object); } public static NTimer obtain() { return factory.obtain(); } public long getTotalNano() { return this.total; } public float getTotalMs() { return this.total / 1e6f; } public float getSeconds() { return this.total / 1e9f; } public float getAvgMs() { return getTotalMs() / runs; } public long getAvgNano() { return getTotalNano() / runs; } public void addNanos(long nanos) { if (!running) throw new IllegalStateException("Timer isn't running"); lastStart -= nanos; } private static class Factory extends Pool<NTimer> { @Override protected NTimer newObject() { return new NTimer(); } @Override public void free(NTimer object) { object.reset(); super.free(object); } } public int getRuns() { return runs; } }