import eu.svjatoslav.sixth.e3d.gui.FrameListener;
import eu.svjatoslav.sixth.e3d.gui.ViewFrame;
import eu.svjatoslav.sixth.e3d.gui.ViewPanel;
+import eu.svjatoslav.sixth.e3d.gui.humaninput.KeyboardInputHandler;
import eu.svjatoslav.sixth.e3d.renderer.raster.ShapeCollection;
+import javax.swing.SwingUtilities;
+import java.awt.event.KeyEvent;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
* reproducible benchmark results to standard output.
*
* <p>The benchmark creates a 16x16x16 grid of cubes (4096 total) with the camera
- * following a deterministic orbital path. Each test runs for 30 seconds.</p>
+ * following a deterministic orbital path. Each test runs for 30 seconds by default.</p>
+ *
+ * <p>Press <b>Space</b> to skip to the next test immediately.</p>
*
* <p>Available tests:</p>
* <ul>
* <li>{@link WireframeCubesTest} - Line rendering</li>
* </ul>
*/
-public class GraphicsBenchmark implements FrameListener {
+public class GraphicsBenchmark implements FrameListener, KeyboardInputHandler {
private static final int WINDOW_WIDTH = 1920;
private static final int WINDOW_HEIGHT = 1080;
private long frameCount;
private BenchmarkTest currentTest;
private boolean testFinished = false;
+ private boolean benchmarkFinished = false;
private final List<TestResult> results = new ArrayList<>();
private final List<BenchmarkTest> tests = new ArrayList<>();
viewPanel.setFrameRate(0);
shapes = viewPanel.getRootShapeCollection();
viewPanel.addFrameListener(this);
+ viewPanel.getKeyboardFocusStack().pushFocusOwner(this);
camera = viewPanel.getCamera();
}
private void startNextTest() {
int nextIndex = results.size();
if (nextIndex >= tests.size()) {
- finishBenchmark();
+ scheduleBenchmarkFinish();
return;
}
currentTest.setup(shapes);
}
+ private void finishCurrentTest() {
+ if (currentTest == null || testFinished) {
+ return;
+ }
+
+ testFinished = true;
+ long elapsed = System.currentTimeMillis() - testStartTime;
+ double durationSeconds = elapsed / 1000.0;
+ results.add(new TestResult(currentTest.getName(), frameCount, durationSeconds));
+
+ currentTest.teardown(shapes);
+ startNextTest();
+ }
+
+ private void scheduleBenchmarkFinish() {
+ benchmarkFinished = true;
+ SwingUtilities.invokeLater(this::finishBenchmark);
+ }
+
private void finishBenchmark() {
currentTest = null;
+ viewPanel.getKeyboardFocusStack().popFocusOwner();
+ viewPanel.removeFrameListener(this);
+ viewPanel.stop();
viewFrame.dispose();
printResults();
}
@Override
public boolean onFrame(ViewPanel viewPanel, int millisecondsSinceLastFrame) {
+ if (benchmarkFinished) {
+ return false;
+ }
+
if (currentTest == null) {
return true;
}
long elapsed = System.currentTimeMillis() - testStartTime;
if (elapsed >= TEST_DURATION_MS && !testFinished) {
- testFinished = true;
- double durationSeconds = elapsed / 1000.0;
- results.add(new TestResult(currentTest.getName(), frameCount, durationSeconds));
-
- currentTest.teardown(shapes);
- startNextTest();
+ finishCurrentTest();
}
return true;
}
+
+ @Override
+ public boolean keyPressed(KeyEvent event, ViewPanel viewPanel) {
+ if (event.getKeyChar() == ' ') {
+ finishCurrentTest();
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean keyReleased(KeyEvent event, ViewPanel viewPanel) {
+ return false;
+ }
+
+ @Override
+ public boolean focusLost(ViewPanel viewPanel) {
+ return false;
+ }
+
+ @Override
+ public boolean focusReceived(ViewPanel viewPanel) {
+ return false;
+ }
}
\ No newline at end of file