MetricsRegistry.java

net.minecraft.util.profiling.metrics.MetricsRegistry

信息

  • 全限定名:net.minecraft.util.profiling.metrics.MetricsRegistry
  • 类型:public class
  • 包:net.minecraft.util.profiling.metrics
  • 源码路径:src/main/java/net/minecraft/util/profiling/metrics/MetricsRegistry.java
  • 起始行号:L10
  • 职责:

    TODO

字段/常量

  • INSTANCE

    • 类型: MetricsRegistry
    • 修饰符: public static final
    • 源码定位: L11
    • 说明:

      TODO

  • measuredInstances

    • 类型: WeakHashMap<ProfilerMeasured,Void>
    • 修饰符: private final
    • 源码定位: L12
    • 说明:

      TODO

内部类/嵌套类型

  • net.minecraft.util.profiling.metrics.MetricsRegistry.AggregatedMetricSampler
    • 类型: class
    • 修饰符: private static
    • 源码定位: L45
    • 说明:

      TODO

构造器

private MetricsRegistry() @ L14

  • 构造器名:MetricsRegistry
  • 源码定位:L14
  • 修饰符:private

参数:

说明:

TODO

方法

下面的方法块按源码顺序生成。

public void add(ProfilerMeasured profilerMeasured) @ L17

  • 方法名:add
  • 源码定位:L17
  • 返回类型:void
  • 修饰符:public

参数:

  • profilerMeasured: ProfilerMeasured

说明:

TODO

public List<MetricSampler> getRegisteredSamplers() @ L21

  • 方法名:getRegisteredSamplers
  • 源码定位:L21
  • 返回类型:List
  • 修饰符:public

参数:

说明:

TODO

private static List<MetricSampler> aggregateDuplicates(Map<String,List<MetricSampler>> potentialDuplicates) @ L30

  • 方法名:aggregateDuplicates
  • 源码定位:L30
  • 返回类型:List
  • 修饰符:private static

参数:

  • potentialDuplicates: Map<String,List>

说明:

TODO

代码

public class MetricsRegistry {
    public static final MetricsRegistry INSTANCE = new MetricsRegistry();
    private final WeakHashMap<ProfilerMeasured, Void> measuredInstances = new WeakHashMap<>();
 
    private MetricsRegistry() {
    }
 
    public void add(ProfilerMeasured profilerMeasured) {
        this.measuredInstances.put(profilerMeasured, null);
    }
 
    public List<MetricSampler> getRegisteredSamplers() {
        Map<String, List<MetricSampler>> samplersByName = this.measuredInstances
            .keySet()
            .stream()
            .flatMap(measuredInstance -> measuredInstance.profiledMetrics().stream())
            .collect(Collectors.groupingBy(MetricSampler::getName));
        return aggregateDuplicates(samplersByName);
    }
 
    private static List<MetricSampler> aggregateDuplicates(Map<String, List<MetricSampler>> potentialDuplicates) {
        return potentialDuplicates.entrySet()
            .stream()
            .map(
                entry -> {
                    String samplerName = entry.getKey();
                    List<MetricSampler> duplicateSamplers = entry.getValue();
                    return (MetricSampler)(duplicateSamplers.size() > 1
                        ? new MetricsRegistry.AggregatedMetricSampler(samplerName, duplicateSamplers)
                        : duplicateSamplers.get(0));
                }
            )
            .collect(Collectors.toList());
    }
 
    private static class AggregatedMetricSampler extends MetricSampler {
        private final List<MetricSampler> delegates;
 
        private AggregatedMetricSampler(String name, List<MetricSampler> delegates) {
            super(name, delegates.get(0).getCategory(), () -> averageValueFromDelegates(delegates), () -> beforeTick(delegates), thresholdTest(delegates));
            this.delegates = delegates;
        }
 
        private static MetricSampler.ThresholdTest thresholdTest(List<MetricSampler> delegates) {
            return value -> delegates.stream().anyMatch(delegate -> delegate.thresholdTest != null ? delegate.thresholdTest.test(value) : false);
        }
 
        private static void beforeTick(List<MetricSampler> delegates) {
            for (MetricSampler delegate : delegates) {
                delegate.onStartTick();
            }
        }
 
        private static double averageValueFromDelegates(List<MetricSampler> delegates) {
            double aggregatedValue = 0.0;
 
            for (MetricSampler delegate : delegates) {
                aggregatedValue += delegate.getSampler().getAsDouble();
            }
 
            return aggregatedValue / delegates.size();
        }
 
        @Override
        public boolean equals(@Nullable Object o) {
            if (this == o) {
                return true;
            } else if (o == null || this.getClass() != o.getClass()) {
                return false;
            } else if (!super.equals(o)) {
                return false;
            } else {
                MetricsRegistry.AggregatedMetricSampler that = (MetricsRegistry.AggregatedMetricSampler)o;
                return this.delegates.equals(that.delegates);
            }
        }
 
        @Override
        public int hashCode() {
            return Objects.hash(super.hashCode(), this.delegates);
        }
    }
}

引用的其他类