gpt4 book ai didi

java - Android游戏固定时间步长

转载 作者:太空宇宙 更新时间:2023-11-04 15:07:10 25 4
gpt4 key购买 nike

阅读有关执行固定时间步长的信息后,请按以下步骤操作:

http://gafferongames.com/game-physics/fix-your-timestep/

我已经在Android上用Java实现了自己的算法版本,这给了我很大的改进,但是我似乎无法消除偶发的麻烦。

我的GameTimer类包含一个称为tick()的方法,该方法每隔一帧就会被调用一次,以延长时间,同时还包含canStep()和step()方法,如下所示:

public void tick() {
long thisTime = System.nanoTime();
frameTime = thisTime - lastTime;
frameTimeMs = (int)(frameTime / NANO_TO_MILLI);
frameCounter++;
secondCounter -= frameTime;
if(secondCounter <= 0) {
fps = frameCounter;
frameCounter = 0;
secondCounter += NANO_TO_SECOND;
}
lastTime = thisTime;

accumulator += Math.min(frameTimeMs, deltaTime * 5);//frameskip >5 frames
alpha = accumulator / deltaTime;
}

public boolean canStep() {
return accumulator >= deltaTime;
}

public void step() {
accumulator -= deltaTime;
alpha = accumulator / deltaTime;
}


注意:deltaTime保持1000f除以每秒所需的更新次数(例如30)。

我的主要游戏循环按帧运行此逻辑,如下所示:

gameTimer.tick();
while(gameTimer.canStep()) {
update();
gameTimer.step();
}

draw();


要计算游戏对象的移动,我需要执行以下操作:

float time = gameTimer.getDeltaTime() / 1000f; //how much of a second per update
velocity = speed * direction * time; //simplified: velocity, speed & direction are vec3s
previousPosition = position;//simplified: values are copied
position += velocity;


然后在绘制时使用线性插值计算移动游戏对象的绘制位置:

lerp(drawPosition, previousPosition, position, 1.0f + gameTimer.getAlpha());


游戏以50到60 fps的速度绘画。尝试每秒更新不会产生任何更好的结果。同样,增加或减少跳帧也不会消除抖动。这个物体突然不时地向前跳了几个像素,我正在努力解决这个问题。

有人能看到我缺少的上述代码有任何明显的问题吗?

任何帮助将不胜感激 :)

最佳答案

也许有点晚了,但是看到这个问题为空使我有些难过。
其他人可能也在想同样的事情。

乍一看,您的代码似乎没有错。
我还成功地用Java实现了gafferongames.com描述的方法。但是,平滑运动的关键不仅在于绘制之前正确的时间步长或内插。
我不确定代码的其余部分,但是确定不会在代码中分配新的对象吗?
调用“ new”将在您的堆上分配新对象,这些新对象可能会在脱离引用时被垃圾回收。垃圾收集会导致轻微或更长的时间(当物体太多时)结巴。

解决这个问题的关键很简单:在初始化过程中分配您需要的每个对象,因此在更新之前。
如果必须分配新对象,请考虑使用一个对象池,该对象池可按如下所述重用同一类的现有对象:
http://gameprogrammingpatterns.com/object-pool.html

希望这可以避免阅读本书的人头疼。

关于java - Android游戏固定时间步长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21839280/

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