minecraft-src/net/minecraft/util/profiling/TracyZoneFiller.java
2025-07-04 02:49:36 +03:00

140 lines
3.6 KiB
Java

package net.minecraft.util.profiling;
import com.mojang.jtracy.Plot;
import com.mojang.jtracy.TracyClient;
import com.mojang.logging.LogUtils;
import java.lang.StackWalker.Option;
import java.lang.StackWalker.StackFrame;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.function.Supplier;
import net.minecraft.SharedConstants;
import net.minecraft.util.profiling.metrics.MetricCategory;
import org.slf4j.Logger;
public class TracyZoneFiller implements ProfilerFiller {
private static final Logger LOGGER = LogUtils.getLogger();
private static final StackWalker STACK_WALKER = StackWalker.getInstance(Set.of(Option.RETAIN_CLASS_REFERENCE), 5);
private final List<com.mojang.jtracy.Zone> activeZones = new ArrayList();
private final Map<String, TracyZoneFiller.PlotAndValue> plots = new HashMap();
private final String name = Thread.currentThread().getName();
@Override
public void startTick() {
}
@Override
public void endTick() {
for (TracyZoneFiller.PlotAndValue plotAndValue : this.plots.values()) {
plotAndValue.set(0);
}
}
@Override
public void push(String name) {
String string = "";
String string2 = "";
int i = 0;
if (SharedConstants.IS_RUNNING_IN_IDE) {
Optional<StackFrame> optional = (Optional<StackFrame>)STACK_WALKER.walk(
stream -> stream.filter(
stackFramex -> stackFramex.getDeclaringClass() != TracyZoneFiller.class && stackFramex.getDeclaringClass() != ProfilerFiller.CombinedProfileFiller.class
)
.findFirst()
);
if (optional.isPresent()) {
StackFrame stackFrame = (StackFrame)optional.get();
string = stackFrame.getMethodName();
string2 = stackFrame.getFileName();
i = stackFrame.getLineNumber();
}
}
com.mojang.jtracy.Zone zone = TracyClient.beginZone(name, string, string2, i);
this.activeZones.add(zone);
}
@Override
public void push(Supplier<String> nameSupplier) {
this.push((String)nameSupplier.get());
}
@Override
public void pop() {
if (this.activeZones.isEmpty()) {
LOGGER.error("Tried to pop one too many times! Mismatched push() and pop()?");
} else {
com.mojang.jtracy.Zone zone = (com.mojang.jtracy.Zone)this.activeZones.removeLast();
zone.close();
}
}
@Override
public void popPush(String name) {
this.pop();
this.push(name);
}
@Override
public void popPush(Supplier<String> nameSupplier) {
this.pop();
this.push((String)nameSupplier.get());
}
@Override
public void markForCharting(MetricCategory category) {
}
@Override
public void incrementCounter(String counterName, int increment) {
((TracyZoneFiller.PlotAndValue)this.plots.computeIfAbsent(counterName, string2 -> new TracyZoneFiller.PlotAndValue(this.name + " " + counterName)))
.add(increment);
}
@Override
public void incrementCounter(Supplier<String> counterNameSupplier, int increment) {
this.incrementCounter((String)counterNameSupplier.get(), increment);
}
private com.mojang.jtracy.Zone activeZone() {
return (com.mojang.jtracy.Zone)this.activeZones.getLast();
}
@Override
public void addZoneText(String text) {
this.activeZone().addText(text);
}
@Override
public void addZoneValue(long value) {
this.activeZone().addValue(value);
}
@Override
public void setZoneColor(int color) {
this.activeZone().setColor(color);
}
static final class PlotAndValue {
private final Plot plot;
private int value;
PlotAndValue(String name) {
this.plot = TracyClient.createPlot(name);
this.value = 0;
}
void set(int value) {
this.value = value;
this.plot.setValue(value);
}
void add(int value) {
this.set(this.value + value);
}
}
}