需要关于java游戏循环的解释

时间:2014-11-03 00:24:55

标签: java

我是java的初学者。我正在努力学习游戏开发。我正在youtube上观看this优秀程序员的教程!我完全跟着他,并达到了这个播放列表的“#9 - 基本碰撞界限”。

他创建了以下游戏循环......

public void run(){
        init();
        long lastTime = System.nanoTime();
        final double amountOfTicks = 60.0;
        double ns = 1000000000 / amountOfTicks;
        double delta = 0;
        int updates = 0;
        int frames = 0;
        long timer = System.currentTimeMillis();

        while(running){
            long now = System.nanoTime();
            delta += (now - lastTime) / ns;
            lastTime = now;
            if(delta >= 1){
                tick();
                updates++;
                delta--;
            }
            render();
            frames++;

            if(System.currentTimeMillis() - timer > 1000){
                timer += 1000;
                System.out.println(updates + " Ticks, Fps " + frames);
                updates = 0;
                frames = 0;
            }

        }
        stop();
    }

我对这种方法很困惑。这种方法如何运作?以下变量如何工作?

amountOfTicks

增量

更新

我理解这里解释这个不太可行,但请帮助我。你也可以给我任何参考学习和理解这一点。如果您需要任何进一步的信息,我会马上提供!

2 个答案:

答案 0 :(得分:2)

已经解释了变量,但是如果你仍然无法理解游戏循环在一般意义上的作用(我不知道他在教程中解释了多少),希望我能从我的内容中得到一些启示。了解到:

基本上,游戏循环,当然,运行(渲染,更新等)游戏,但它也设置游戏运行的恒定,可控速度。

例如,想象一下你想制作一个2D RPG游戏,你想要一个暴徒(角色)在屏幕上移动,比如每秒200像素。你可以通过一个循环来做到这一点,但问题是,不同的计算机将导致角色在不同的时间移动得更快或更慢,因为计算机只会尽可能快地一遍又一遍地执行循环中的代码。

这就是为什么你实现代码来控制代码执行的速度,以及游戏更新的速度。您可以使用现实世界时间(使用以纳秒为单位获取时间的方法)来完成此操作。您将游戏限制为每秒仅更新帧数60次。

在while(running)循环中使用if语句,只在程序经过循环时才进行游戏更新,并且自上次执行if语句以来的时间至少为1/60秒。

希望这是有道理的。很抱歉,回复很长。如果您有更多问题,请随时提出!

答案 1 :(得分:1)

amountOfTicks基本上定义了您希望在一秒钟内获得多少个刻度!所以使用值60,方法tick()将被称为约。每秒60次。在tick()方法中,通常你的游戏逻辑应该发生!

delta描述了System.nanoTime(从现在开始)到最后一个tick()之间的纳秒时间差。当该值超过1时,将调用tick并将delta减1。

第二个if语句每秒都会打印屏幕在该秒段内呈现的频率以及发生了多少更新。每次tick()都会增加更新,因此这应该是60左右。帧计数器将高很多,具体取决于框架和底层硬件。

我觉得奇怪的是,render()可能经常被调用。这可能是一个非常昂贵的调用,但这取决于给定的框架和硬件。