FramerateLimiter.java

net.minecraft.client.FramerateLimiter

信息

  • 全限定名:net.minecraft.client.FramerateLimiter
  • 类型:public class
  • 包:net.minecraft.client
  • 源码路径:src/main/java/net/minecraft/client/FramerateLimiter.java
  • 起始行号:L8
  • 职责:

    TODO

字段/常量

  • OVERSHOOT_SMOOTHING

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

      TODO

  • MAX_CURRENT_OVERSHOOT_NS

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

      TODO

  • MAX_AVERAGE_OVERSHOOT_NS

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

      TODO

  • ONE_SECOND_IN_NANOSECONDS

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

      TODO

  • SPIN_SAFETY_BUFFER_NS

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

      TODO

  • lastFrameTime

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

      TODO

  • averageOvershootNs

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

      TODO

  • lastFramerateLimit

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

      TODO

内部类/嵌套类型

构造器

方法

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

public static void limitDisplayFPS(int framerateLimit) @ L18

  • 方法名:limitDisplayFPS
  • 源码定位:L18
  • 返回类型:void
  • 修饰符:public static

参数:

  • framerateLimit: int

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public class FramerateLimiter {
    private static final double OVERSHOOT_SMOOTHING = 0.1;
    private static final long MAX_CURRENT_OVERSHOOT_NS = 25000000L;
    private static final long MAX_AVERAGE_OVERSHOOT_NS = 2000000L;
    private static final long ONE_SECOND_IN_NANOSECONDS = 1000000000L;
    private static final long SPIN_SAFETY_BUFFER_NS = 500000L;
    private static long lastFrameTime = System.nanoTime();
    private static long averageOvershootNs = 0L;
    private static int lastFramerateLimit;
 
    public static void limitDisplayFPS(int framerateLimit) {
        long targetTimePerFrame = 1000000000L / framerateLimit;
        long targetTimeNs = lastFrameTime + targetTimePerFrame;
        if (framerateLimit != lastFramerateLimit) {
            averageOvershootNs = 0L;
            lastFramerateLimit = framerateLimit;
        }
 
        long remainingTimeNs;
        while ((remainingTimeNs = targetTimeNs - System.nanoTime()) > 0L) {
            if (remainingTimeNs > averageOvershootNs + 500000L) {
                long sleepStartTimeNs = System.nanoTime();
                long expectedSleepTimeNs = remainingTimeNs - averageOvershootNs - 500000L;
                if (!Thread.interrupted()) {
                    LockSupport.parkNanos(expectedSleepTimeNs);
                    long sleepDurationNs = System.nanoTime() - sleepStartTimeNs;
                    long currentOvershootNs = sleepDurationNs - expectedSleepTimeNs;
                    if (currentOvershootNs > 0L && currentOvershootNs < 25000000L) {
                        averageOvershootNs = (long)(0.1 * currentOvershootNs + 0.9 * averageOvershootNs);
                        averageOvershootNs = Math.min(averageOvershootNs, 2000000L);
                    }
                }
            } else {
                Thread.onSpinWait();
            }
        }
 
        lastFrameTime = System.nanoTime();
    }
}

引用的其他类