Skip to content

Commit e4224e9

Browse files
committed
feat: add tracy profiler integration
1 parent 05373e9 commit e4224e9

File tree

4 files changed

+32
-4
lines changed

4 files changed

+32
-4
lines changed

build.gradle.kts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,8 @@ dependencies {
100100
// Natives for JNBullet
101101
natives(group = "org.terasology.jnbullet", name = "JNBullet", version = "1.0.4", ext = "zip")
102102

103+
// Natives for Tracy bindings (embedded in JAR)
104+
natives("io.github.benjaminamos.TracyJavaBindings:TracyJavaBindings:1.0.0-SNAPSHOT")
103105
}
104106

105107
tasks.register<Copy>("extractWindowsNatives") {
@@ -135,14 +137,22 @@ tasks.register<Copy>("extractNativeBulletNatives") {
135137
into("$dirNatives")
136138
}
137139

140+
tasks.register<Copy>("extractTracyJNINatives") {
141+
description = "Extracts the Tracy JNI natives from the module jar"
142+
from(configurations["natives"].filter { it.name.contains("TracyJavaBindings") }.map { zipTree(it) })
143+
into(dirNatives)
144+
exclude("io/**", "META-INF/**")
145+
}
146+
138147
tasks.register("extractNatives") {
139148
description = "Extracts all the native lwjgl libraries from the downloaded zip"
140149
dependsOn(
141150
"extractWindowsNatives",
142151
"extractLinuxNatives",
143152
"extractMacOSXNatives",
144153
"extractJNLuaNatives",
145-
"extractNativeBulletNatives"
154+
"extractNativeBulletNatives",
155+
"extractTracyJNINatives"
146156
)
147157
// specifying the outputs directory lets gradle have an up-to-date check, and automatic clean task
148158
outputs.dir("$dirNatives")

engine/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,8 @@ dependencies {
142142
implementation("org.terasology.crashreporter:cr-terasology:5.0.0")
143143

144144
api(project(":subsystems:TypeHandlerLibrary"))
145+
146+
implementation("io.github.benjaminamos.TracyJavaBindings:TracyJavaBindings:1.0.0-SNAPSHOT")
145147
}
146148

147149
protobuf {

engine/src/main/java/org/terasology/engine/core/TerasologyEngine.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -468,12 +468,10 @@ public synchronized void runMain() {
468468
*/
469469
@SuppressWarnings("checkstyle:EmptyBlock")
470470
private void mainLoop() {
471-
PerformanceMonitor.startActivity("Other");
472471
// MAIN GAME LOOP
473472
while (tick()) {
474473
/* do nothing */
475474
}
476-
PerformanceMonitor.endActivity();
477475
}
478476

479477
/**
@@ -482,6 +480,7 @@ private void mainLoop() {
482480
* @return true if the loop requesting a tick should continue running
483481
*/
484482
public boolean tick() {
483+
PerformanceMonitor.startActivity("Tick");
485484
if (shutdownRequested) {
486485
return false;
487486
}
@@ -524,8 +523,8 @@ public boolean tick() {
524523
}
525524
assetTypeManager.disposedUnusedAssets();
526525

526+
PerformanceMonitor.endActivity();
527527
PerformanceMonitor.rollCycle();
528-
PerformanceMonitor.startActivity("Other");
529528
return true;
530529
}
531530

engine/src/main/java/org/terasology/engine/monitoring/impl/PerformanceMonitorImpl.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// SPDX-License-Identifier: Apache-2.0
33
package org.terasology.engine.monitoring.impl;
44

5+
import io.github.benjaminamos.tracy.Tracy;
56
import com.google.common.collect.Lists;
67
import com.google.common.collect.Queues;
78
import gnu.trove.map.TObjectDoubleMap;
@@ -78,6 +79,8 @@ public PerformanceMonitorImpl() {
7879

7980
timer = (EngineTime) CoreRegistry.get(Time.class);
8081
mainThread = Thread.currentThread();
82+
83+
Tracy.startupProfiler();
8184
}
8285

8386
@Override
@@ -101,6 +104,10 @@ public void rollCycle() {
101104

102105
currentExecutionData = new TObjectLongHashMap<>();
103106
currentAllocationData = new TObjectLongHashMap<>();
107+
108+
activityStack.clear();
109+
110+
Tracy.markFrame();
104111
}
105112

106113
@Override
@@ -111,6 +118,11 @@ public Activity startActivity(String activityName) {
111118

112119
ActivityInfo newActivity = new ActivityInfo(activityName).initialize();
113120

121+
StackWalker.StackFrame caller = java.security.AccessController.doPrivileged((java.security.PrivilegedAction<StackWalker.StackFrame>) () ->
122+
StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE).walk(s -> s.skip(4).findFirst()).get());
123+
long sourceLocation = Tracy.allocSourceLocation(caller.getLineNumber(), caller.getFileName(), caller.getClassName() + "#" + caller.getMethodName(), activityName, 0);
124+
newActivity.zoneContext = Tracy.zoneBegin(sourceLocation, 1);
125+
114126
if (!activityStack.isEmpty()) {
115127
ActivityInfo currentActivity = activityStack.peek();
116128
currentActivity.ownTime += newActivity.startTime - ((currentActivity.resumeTime > 0)
@@ -133,6 +145,8 @@ public void endActivity() {
133145

134146
ActivityInfo oldActivity = activityStack.pop();
135147

148+
Tracy.zoneEnd(oldActivity.zoneContext);
149+
136150
long endTime = timer.getRealTimeInMs();
137151
long totalTime = (oldActivity.resumeTime > 0)
138152
? oldActivity.ownTime + endTime - oldActivity.resumeTime
@@ -152,6 +166,7 @@ public void endActivity() {
152166
}
153167
}
154168

169+
155170
@Override
156171
public TObjectDoubleMap<String> getRunningMean() {
157172
TObjectDoubleMap<String> activityToMeanMap = new TObjectDoubleHashMap<>();
@@ -186,6 +201,8 @@ private class ActivityInfo {
186201
public long ownTime;
187202
public long startMem;
188203
public long ownMem;
204+
public StackWalker.StackFrame caller;
205+
public Tracy.ZoneContext zoneContext;
189206

190207
ActivityInfo(String activityName) {
191208
this.name = activityName;

0 commit comments

Comments
 (0)