FramerateLimitTracker.java

com.mojang.blaze3d.platform.FramerateLimitTracker

信息

  • 全限定名:com.mojang.blaze3d.platform.FramerateLimitTracker
  • 类型:public class
  • 包:com.mojang.blaze3d.platform
  • 源码路径:src/main/java/com/mojang/blaze3d/platform/FramerateLimitTracker.java
  • 起始行号:L11
  • 职责:

    TODO

字段/常量

  • OUT_OF_LEVEL_MENU_LIMIT

    • 类型: int
    • 修饰符: private static final
    • 源码定位: L12
    • 说明:

      TODO

  • ICONIFIED_WINDOW_LIMIT

    • 类型: int
    • 修饰符: private static final
    • 源码定位: L13
    • 说明:

      TODO

  • AFK_LIMIT

    • 类型: int
    • 修饰符: private static final
    • 源码定位: L14
    • 说明:

      TODO

  • LONG_AFK_LIMIT

    • 类型: int
    • 修饰符: private static final
    • 源码定位: L15
    • 说明:

      TODO

  • AFK_THRESHOLD_MS

    • 类型: long
    • 修饰符: private static final
    • 源码定位: L16
    • 说明:

      TODO

  • LONG_AFK_THRESHOLD_MS

    • 类型: long
    • 修饰符: private static final
    • 源码定位: L17
    • 说明:

      TODO

  • options

    • 类型: Options
    • 修饰符: private final
    • 源码定位: L18
    • 说明:

      TODO

  • minecraft

    • 类型: Minecraft
    • 修饰符: private final
    • 源码定位: L19
    • 说明:

      TODO

  • framerateLimit

    • 类型: int
    • 修饰符: private
    • 源码定位: L20
    • 说明:

      TODO

  • latestInputTime

    • 类型: long
    • 修饰符: private
    • 源码定位: L21
    • 说明:

      TODO

内部类/嵌套类型

  • com.mojang.blaze3d.platform.FramerateLimitTracker.FramerateThrottleReason
    • 类型: enum
    • 修饰符: public static
    • 源码定位: L75
    • 说明:

      TODO

构造器

public FramerateLimitTracker(Options options, Minecraft minecraft) @ L23

  • 构造器名:FramerateLimitTracker
  • 源码定位:L23
  • 修饰符:public

参数:

  • options: Options
  • minecraft: Minecraft

说明:

TODO

方法

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

public int getFramerateLimit() @ L29

  • 方法名:getFramerateLimit
  • 源码定位:L29
  • 返回类型:int
  • 修饰符:public

参数:

说明:

TODO

public FramerateLimitTracker.FramerateThrottleReason getThrottleReason() @ L39

  • 方法名:getThrottleReason
  • 源码定位:L39
  • 返回类型:FramerateLimitTracker.FramerateThrottleReason
  • 修饰符:public

参数:

说明:

TODO

public boolean isHeavilyThrottled() @ L61

  • 方法名:isHeavilyThrottled
  • 源码定位:L61
  • 返回类型:boolean
  • 修饰符:public

参数:

说明:

TODO

public void setFramerateLimit(int value) @ L66

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

参数:

  • value: int

说明:

TODO

public void onInputReceived() @ L70

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

参数:

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public class FramerateLimitTracker {
    private static final int OUT_OF_LEVEL_MENU_LIMIT = 60;
    private static final int ICONIFIED_WINDOW_LIMIT = 10;
    private static final int AFK_LIMIT = 30;
    private static final int LONG_AFK_LIMIT = 10;
    private static final long AFK_THRESHOLD_MS = 60000L;
    private static final long LONG_AFK_THRESHOLD_MS = 600000L;
    private final Options options;
    private final Minecraft minecraft;
    private int framerateLimit;
    private long latestInputTime;
 
    public FramerateLimitTracker(Options options, Minecraft minecraft) {
        this.options = options;
        this.minecraft = minecraft;
        this.framerateLimit = options.framerateLimit().get();
    }
 
    public int getFramerateLimit() {
        return switch (this.getThrottleReason()) {
            case NONE -> this.framerateLimit;
            case WINDOW_ICONIFIED -> 10;
            case LONG_AFK -> 10;
            case SHORT_AFK -> Math.min(this.framerateLimit, 30);
            case OUT_OF_LEVEL_MENU -> 60;
        };
    }
 
    public FramerateLimitTracker.FramerateThrottleReason getThrottleReason() {
        InactivityFpsLimit inactivityFpsLimit = this.options.inactivityFpsLimit().get();
        if (this.minecraft.getWindow().isIconified()) {
            return FramerateLimitTracker.FramerateThrottleReason.WINDOW_ICONIFIED;
        } else {
            if (inactivityFpsLimit == InactivityFpsLimit.AFK) {
                long afkTimeMillis = Util.getMillis() - this.latestInputTime;
                if (afkTimeMillis > 600000L) {
                    return FramerateLimitTracker.FramerateThrottleReason.LONG_AFK;
                }
 
                if (afkTimeMillis > 60000L) {
                    return FramerateLimitTracker.FramerateThrottleReason.SHORT_AFK;
                }
            }
 
            return this.minecraft.level != null || this.minecraft.screen == null && this.minecraft.getOverlay() == null
                ? FramerateLimitTracker.FramerateThrottleReason.NONE
                : FramerateLimitTracker.FramerateThrottleReason.OUT_OF_LEVEL_MENU;
        }
    }
 
    public boolean isHeavilyThrottled() {
        FramerateLimitTracker.FramerateThrottleReason reason = this.getThrottleReason();
        return reason == FramerateLimitTracker.FramerateThrottleReason.WINDOW_ICONIFIED || reason == FramerateLimitTracker.FramerateThrottleReason.LONG_AFK;
    }
 
    public void setFramerateLimit(int value) {
        this.framerateLimit = value;
    }
 
    public void onInputReceived() {
        this.latestInputTime = Util.getMillis();
    }
 
    @OnlyIn(Dist.CLIENT)
    public static enum FramerateThrottleReason {
        NONE,
        WINDOW_ICONIFIED,
        LONG_AFK,
        SHORT_AFK,
        OUT_OF_LEVEL_MENU;
    }
}

引用的其他类

  • Minecraft

    • 引用位置: 参数/字段
  • Options

    • 引用位置: 参数/字段
  • Util

    • 引用位置: 方法调用
    • 关联成员: Util.getMillis()