我是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
增量
更新
框
我理解这里解释这个不太可行,但请帮助我。你也可以给我任何参考学习和理解这一点。如果您需要任何进一步的信息,我会马上提供!
答案 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()可能经常被调用。这可能是一个非常昂贵的调用,但这取决于给定的框架和硬件。