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;
}
}