java - 游戏循环控制

标签 java java-3d

我在理解控制游戏循环的一段代码时遇到了巨大的困难...我无法理解这个 while 循环“while(unprocessedSeconds > SecondsForEachTick)”的目的以及为什么 FPS 计数器如果在 if(tickCounter % 60 ==0) 内部,代码如下:

public void run() 
{
    int frames = 0;
    double unprocessedSeconds = 0;
    long previousTime = System.nanoTime();

    double secondsForEachTick = 1/60.0; 


    int tickCount = 0; //RENDER COUNTER
    boolean ticked = false;

    while (running) 
    {
        long currentTime = System.nanoTime();
        long passedTime = currentTime - previousTime;

        previousTime = currentTime;

        unprocessedSeconds = unprocessedSeconds + passedTime / 1000000000.0;

        int count = 0;
        while(unprocessedSeconds > secondsForEachTick)
        {   
            tick();
            count++;
            unprocessedSeconds -= secondsForEachTick; 

            ticked = true;
            tickCount++;

            if(tickCount % 60 == 0){
                System.out.println(frames + " fps");
                previousTime += 1000;
                frames = 0;
            }
        }
        System.out.println("Iterações do loop: "+count);

        if(ticked)
        {
            render();
            frames++;
            ticked = false;
        }

    }
}

最佳答案

内部的 while 循环确保游戏更新基于固定时间,而不是帧时间。未处理的时间正在被收集,一旦它大于一个刻度的时间范围,它就会调用 tick()

TickCount 基本上是计算滴答数(滴答时间为 1/60 秒,因此 60 滴答/秒),并且一旦 1 秒过去,它就会打印收集的帧(因此 FPS )。此外,勾选表示游戏中可能会发生某些变化,因此需要新的渲染。

关于java - 游戏循环控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17724227/

相关文章:

java - 从 Californium CoAP 客户端检索观测值

java - 从字符串构建 char

java - 如何使用 Java3D API 在 Java 中绘制简单的 3D 点(x,y,z)?

java - java3d Vector4f 和 Vector3f 之间的区别

java - 自定义 JTableHeader 导致 NullPointerException

java - 比较 EST EDT 中的两个 joda DateTime 实例

用于描述 UI 的 Java DSL?

java - 如何在 java 3d 中旋转相机/viewPlatform

java - jMonkeyEngine OBJ 文件没有按预期出现

java - 如何将屏幕上的 Canvas3D 保存为图像?