private BenchmarkTest currentTest;
private boolean testFinished = false;
private boolean benchmarkFinished = false;
+ private boolean pendingTestTransition = false;
private final List<TestResult> results = new ArrayList<>();
private final List<BenchmarkTest> tests = new ArrayList<>();
new GraphicsBenchmark();
}
- /**
+/**
* Constructs and runs the graphics benchmark.
*/
public GraphicsBenchmark() {
- initializeWindow();
- registerTests();
- startNextTest();
+ registerTests(); // populate tests FIRST, before render thread starts
+ initializeWindow(); // now onFrame can safely access the tests list
}
private void initializeWindow() {
viewPanel.addFrameListener(this);
viewPanel.getKeyboardFocusStack().pushFocusOwner(this);
camera = viewPanel.getCamera();
+ // Now explicitly start the render thread after all listeners are registered
+ viewPanel.ensureRenderThreadStarted();
}
private void registerTests() {
double durationSeconds = elapsed / 1000.0;
results.add(new TestResult(currentTest.getName(), frameCount, durationSeconds));
- currentTest.teardown(shapes);
+ // Defer test transition to safe point (beginning of next frame)
+ pendingTestTransition = true;
+ }
+
+ private void performTestTransition() {
+ if (currentTest != null) {
+ currentTest.teardown(shapes);
+ }
startNextTest();
}
@Override
public boolean onFrame(ViewPanel viewPanel, int millisecondsSinceLastFrame) {
+ // Perform deferred test transition at safe point (before render cycle starts)
+ if (pendingTestTransition) {
+ pendingTestTransition = false;
+ performTestTransition();
+ }
+
+ // Deferred first-test start: runs on the render thread, before renderFrame()
+ if (currentTest == null && !benchmarkFinished && results.isEmpty()) {
+ startNextTest();
+ }
+
if (benchmarkFinished) {
return false;
}
if (currentTest == null) {
- return true;
+ return false;
}
orbitAngle += ORBIT_SPEED * millisecondsSinceLastFrame;