diff --git a/.gitattributes b/.gitattributes index d45110fc654..88fe439c2d9 100644 --- a/.gitattributes +++ b/.gitattributes @@ -16886,6 +16886,7 @@ forge-gui/src/main/html/js/jquery/jquery-1.9.1.min.js -text forge-gui/src/main/html/js/observable.js -text forge-gui/src/main/html/js/socket.js -text forge-gui/src/main/java/forge/FThreads.java -text +forge-gui/src/main/java/forge/FTrace.java -text forge-gui/src/main/java/forge/GuiBase.java -text forge-gui/src/main/java/forge/UiCommand.java svneol=native#text/plain forge-gui/src/main/java/forge/achievement/Achievement.java -text diff --git a/forge-gui-mobile/src/forge/Forge.java b/forge-gui-mobile/src/forge/Forge.java index 215f6076a69..f44dae9e187 100644 --- a/forge-gui-mobile/src/forge/Forge.java +++ b/forge-gui-mobile/src/forge/Forge.java @@ -222,6 +222,7 @@ public class Forge implements ApplicationListener { @Override public void render() { try { + forge.FTrace.get("Render").start(); ImageCache.allowSingleLoad(); ForgeAnimation.advanceAll(); @@ -253,6 +254,7 @@ public class Forge implements ApplicationListener { graphics.end(); BugReporter.reportException(ex, GuiBase.getInterface()); } + forge.FTrace.get("Render").end(); } @Override @@ -293,6 +295,10 @@ public class Forge implements ApplicationListener { screens.clear(); graphics.dispose(); SoundSystem.instance.dispose(); + try { + ExceptionHandler.unregisterErrorHandling(); + } + catch (Exception e) {} } //log message to Forge.log file diff --git a/forge-gui/src/main/java/forge/FTrace.java b/forge-gui/src/main/java/forge/FTrace.java new file mode 100644 index 00000000000..40154064185 --- /dev/null +++ b/forge-gui/src/main/java/forge/FTrace.java @@ -0,0 +1,70 @@ +package forge; + +import java.text.NumberFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +public class FTrace { + private static long appStartTime; + private static Map traces = new HashMap(); + private static SimpleDateFormat guiFormatter = new SimpleDateFormat("hh:mm:ss.SSS"); + + public static void initialize() { + appStartTime = new Date().getTime(); + } + + public static FTrace get(String name0) { + FTrace trace = traces.get(name0); + if (trace == null) { + trace = new FTrace(name0); + traces.put(name0, trace); + } + return trace; + } + + public static String formatTimestamp(Date timestamp) { + if (GuiBase.getInterface().isGuiThread()) { + return guiFormatter.format(timestamp); //use cache formatter for better performance on GUI thread + } + return new SimpleDateFormat("hh:mm:ss.SSS").format(timestamp); + } + + //dump total time of all traces into log file + public static void dump() { + long appTotalTime = new Date().getTime() - appStartTime; + NumberFormat percent = NumberFormat.getPercentInstance(); + + System.out.println(); + System.out.println("Forge total time - " + appTotalTime + "ms"); + for (FTrace trace : traces.values()) { + System.out.println(trace.name + " total time - " + trace.totalTime + "ms (" + percent.format((double)trace.totalTime / (double)appTotalTime) + ")"); + } + traces.clear(); + } + + private final String name; + private long startTime; + private long totalTime; + + private FTrace(String name0) { + name = name0; + } + + public void start() { + Date now = new Date(); + startTime = now.getTime(); + System.out.println(name + " start - " + formatTimestamp(now)); + } + + public void end() { + if (startTime == 0) { return; } + + Date now = new Date(); + long elapsed = now.getTime() - startTime; + startTime = 0; + totalTime += elapsed; + System.out.println(name + " end - " + formatTimestamp(now) + " (" + elapsed + "ms)"); + } +} diff --git a/forge-gui/src/main/java/forge/error/ExceptionHandler.java b/forge-gui/src/main/java/forge/error/ExceptionHandler.java index 8129aaef3b5..430d3f0b95a 100644 --- a/forge-gui/src/main/java/forge/error/ExceptionHandler.java +++ b/forge-gui/src/main/java/forge/error/ExceptionHandler.java @@ -28,6 +28,7 @@ import java.lang.Thread.UncaughtExceptionHandler; import com.esotericsoftware.minlog.Log; +import forge.FTrace; import forge.interfaces.IGuiBase; import forge.properties.ForgeConstants; import forge.util.MultiplexOutputStream; @@ -90,6 +91,7 @@ public class ExceptionHandler implements UncaughtExceptionHandler { System.setErr(new PrintStream(new MultiplexOutputStream(System.err, logFileStream), true)); Log.debug("Error handling registered!"); + FTrace.initialize(); } /** @@ -97,6 +99,7 @@ public class ExceptionHandler implements UncaughtExceptionHandler { * stream and resets the system output streams. */ public static void unregisterErrorHandling() throws IOException { + FTrace.dump(); //dump trace before unregistering error handling System.setOut(oldSystemOut); System.setErr(oldSystemErr); logFileStream.close();