gpt4 book ai didi

java - 使用 Java 更新和渲染 2D 游戏

转载 作者:行者123 更新时间:2023-12-01 14:19:22 25 4
gpt4 key购买 nike

所以,我正在用 Java 制作 2D 游戏,但我确实没有太多 Java 经验。我目前使用一个非常简单的循环,使用每 10 毫秒左右运行一次的 Swing 计时器,如下所示:

public void actionPerformed(ActionEvent e) {
update();
repaint();
}

但是,出于显而易见的原因,我需要一些更实用的东西。这些原因包括更多的延迟意味着更少的 FPS 和更慢的移动/其他更新。我在 3D Java 游戏教程 here 中找到了以下代码。当程序启动时它就会开始运行,并且我足够了解它会起作用。但是,我并不完全理解它:(tick() 是更新器,render() 渲染屏幕)

    long currenttime;
long previoustime = System.nanoTime();
long passedtime;
int frames = 0;
double unprocessedseconds = 0;
double secondspertick = 1 / 60.0;
int tickcount = 0;
boolean ticked = false;

while (gameIsRunning) {
currenttime = System.nanoTime();
passedtime = currenttime - previoustime;
previoustime = currenttime;
unprocessedseconds += passedtime / 1000000000.0;

while (unprocessedseconds > secondspertick) {
tick();
unprocessedseconds -= secondspertick;
ticked = true;
tickcount++;
System.out.println(tickcount);
if (tickcount % 60 == 0) {
System.out.println(frames + " FPS");
previoustime += 1000;
frames = 0;
}
}
if (ticked) {
render();
frames++;
}
render();
frames++;
}

这段代码在我发现它的教程中没有解释。有人可以分解它并解释它吗?我也看过here对于想法,该页面上带有渲染线程和更新线程的最后一段代码对我来说很有意义。我应该使用哪种方法?上述其中之一,还是完全不同的东西?另外,你可能会说这是我在 stackoverflow 上的第一个问题。提前致谢,乔什

最佳答案

tick() 可能正在更新游戏对象的物理属性(位置、速度等),tick() 每次更新都会被多次调用,因为某些模拟无法在不变得不稳定的情况下处理太大的时间步长。

网上有一篇很受欢迎的文章解释了为什么会出现这种情况,以及为什么使用固定时间步长是正确的过程。 Check it out.

每次更新游戏都会以 1/60 秒(即每秒 60 帧)的增量前进。重复此操作,直到总计剩余时间少于 1/60 秒。聚合只是求和的一个花哨的词。

然后游戏当前状态的快照将呈现在屏幕上。

我不会太深入,但实际上这段代码应该通过 render() 期间聚合中的剩余时间来内插每个对象的位置。

long currenttime;
long previoustime = System.nanoTime();
long passedtime;
int frames = 0;
//this is an aggregate, games usually step in fixed units of time.
//this is usually because physics simulations can't handle too large of time steps.
double unprocessedseconds = 0;
double secondspertick = 1 / 60.0;
int tickcount = 0;
boolean ticked = false;

while (gameIsRunning) {
//get elapsed nano seconds from the epoch (january 1st, 1970)
currenttime = System.nanoTime();
//take difference of current time in nanos and previous time in nanos
passedtime = currenttime - previoustime;
previoustime = currenttime;
//divide to get the elapsed time in seconds.
unprocessedseconds += passedtime / 1000000000.0;

while (unprocessedseconds > secondspertick) {
tick();
unprocessedseconds -= secondspertick;
ticked = true;
tickcount++;
System.out.println(tickcount);
if (tickcount % 60 == 0) {
System.out.println(frames + " FPS");
previoustime += 1000;
frames = 0;
}
}
if (ticked) {
render();
frames++;
}
render();
frames++;
}

祝乔希好运。

编辑:

我对使用一个线程进行更新和一个线程进行渲染的游戏没有任何经验。因此,我无法就此提供建议。如果您对多线程经验很少或没有,我会避免使用它,因为只有复杂的游戏可能需要这种方法,而多线程会增加您可能不想处理的大量问题。

与单线程游戏相比,多线程游戏引擎在渲染和更新之间会消耗更多内存,或者最终会相互依赖。这是因为两个线程无法同时操作相同的数据。因此,两个线程操作的唯一方法是在这些数据结构上同步,或者通过更新线程为渲染线程提供不可变的数据来渲染。

编写多线程游戏引擎将是对线程的一个很好的介绍。它可以教你很多东西。取决于您想从中得到什么。

如果您正在制作一款 2D 游戏,我更有信心您将不需要一个用于更新的线程和一个用于渲染的线程。

如果你真的想追求这个,here's the approach I'd take.

您不需要超过 while 循环来控制渲染。

关于java - 使用 Java 更新和渲染 2D 游戏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17756521/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com