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 java.util.stream.Stream; 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 activeZones = new ArrayList<>(); private final Map plots = new HashMap<>(); private final String name = Thread.currentThread().getName(); @Override public void startTick() { } @Override public void endTick() { for (TracyZoneFiller.PlotAndValue tracyzonefiller$plotandvalue : this.plots.values()) { tracyzonefiller$plotandvalue.set(0); } } @Override public void push(String p_364548_) { String s = ""; String s1 = ""; int i = 0; if (SharedConstants.IS_RUNNING_IN_IDE) { Optional optional = STACK_WALKER.walk( p_361443_ -> p_361443_.filter( p_366989_ -> p_366989_.getDeclaringClass() != TracyZoneFiller.class && p_366989_.getDeclaringClass() != ProfilerFiller.CombinedProfileFiller.class ) .findFirst() ); if (optional.isPresent()) { StackFrame stackframe = optional.get(); s = stackframe.getMethodName(); s1 = stackframe.getFileName(); i = stackframe.getLineNumber(); } } com.mojang.jtracy.Zone zone = TracyClient.beginZone(p_364548_, s, s1, i); this.activeZones.add(zone); } @Override public void push(Supplier p_367014_) { this.push(p_367014_.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 = this.activeZones.removeLast(); zone.close(); } } @Override public void popPush(String p_362480_) { this.pop(); this.push(p_362480_); } @Override public void popPush(Supplier p_368969_) { this.pop(); this.push(p_368969_.get()); } @Override public void markForCharting(MetricCategory p_360953_) { } @Override public void incrementCounter(String p_362137_, int p_362577_) { this.plots.computeIfAbsent(p_362137_, p_367016_ -> new TracyZoneFiller.PlotAndValue(this.name + " " + p_362137_)).add(p_362577_); } @Override public void incrementCounter(Supplier p_362628_, int p_368047_) { this.incrementCounter(p_362628_.get(), p_368047_); } private com.mojang.jtracy.Zone activeZone() { return this.activeZones.getLast(); } @Override public void addZoneText(String p_362912_) { this.activeZone().addText(p_362912_); } @Override public void addZoneValue(long p_366154_) { this.activeZone().addValue(p_366154_); } @Override public void setZoneColor(int p_363144_) { this.activeZone().setColor(p_363144_); } static final class PlotAndValue { private final Plot plot; private int value; PlotAndValue(String p_366532_) { this.plot = TracyClient.createPlot(p_366532_); this.value = 0; } void set(int p_362550_) { this.value = p_362550_; this.plot.setValue(p_362550_); } void add(int p_365380_) { this.set(this.value + p_365380_); } } }