140 lines
		
	
	
	
		
			3.6 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			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);
 | |
| 		}
 | |
| 	}
 | |
| }
 |