gpt4 book ai didi

java - 游戏循环速度不稳定

转载 作者:行者123 更新时间:2023-11-29 22:19:05 24 4
gpt4 key购买 nike

我正在 Android 上使用 OpenGL(-es) 制作一个简单的闯关游戏。最初我在同一个循环中更新了游戏的状态和绘图调用:onDrawFrame。现在我决定将两者分开,只将渲染调用留在 onDrawFrame 中,游戏状态在另一个线程中管理:

public void run() {
Log.d("GameLogicThread", "GameLogicThread started");
final long UPDATE_INTERVAL = 1000000000 / 30;
long endingTime;
int timeElapsed;
long startingTime = System.nanoTime();

while (!running) {// wait for it...

}
while (running) {
endingTime = System.nanoTime();
timeElapsed = (int) (endingTime - startingTime);
Log.d("timeElapsed",Integer.toString(timeElapsed));
if (timeElapsed < UPDATE_INTERVAL-timeElapsed){
try {
Thread.sleep(timeElapsed);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

startingTime = System.nanoTime();
Game.updateGame(timeElapsed);
}

编辑
我现在已经像这样更改了代码^^,但它仍然无法正常工作..

是不是循环本身出了什么问题,还是我应该看看外面(可能不是,因为它在移动代码之前运行良好)。我该怎么办?

最佳答案

下面的评论中指出/讨论了一些逻辑错误:

    endingTime = System.currentTimeMillis();
timeElapsed = (int) (endingTime - startingTime);
// Why is the "elapsed" time being waited? Hmm.
// If *any* wait is being done (I'd recommend sleep(0) for starters)
// it should be the MAXIMUM desired cycle time MINUS the
// currently used cycle time (MINUS some fudge factor).
if (timeElapsed < UPDATE_INTERVAL) // I dislike hanging blocks...
try {
Thread.sleep(timeElapsed);
} catch (InterruptedException e) {
e.printStackTrace();
}

startingTime = System.currentTimeMillis();
// The game needs to know the TOTAL time elapsed since
// the last update, not the time "until before the yield".
// This will likely be passed fictitiously small values as
// it is only time the the LAST updateGame took to run.
Game.updateGame(timeElapsed);

我永远不会期望看到 timeElapsed(传递给 updateGame)低于 10 毫秒,使用 sleep(...) 和更正的时间计算。

但是,它可能没有所需的精度(将最小周期长度增加到 1/30 秒,这将由固定的数学计算得出,这会使它不那么重要):参见 Cristian Vrabie 的回答有关更高分辨率计时器的建议。 (可能有一些专门为此设计的更好的 3rd 方替代方案——在“普通”Java 中有——我不编写 Android 程序;-)

快乐编码。

关于java - 游戏循环速度不稳定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7758691/

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