gpt4 book ai didi

java - LibGDX 游戏渲染时滞后

转载 作者:行者123 更新时间:2023-12-02 04:13:49 27 4
gpt4 key购买 nike

我有一个障碍物数组(Vector2对象的Array),它们从屏幕的右侧移动到左侧,因此在每次调用render时() 函数我将它们的 x 位置递减 400*deltaTime 值,然后使用 SpriteBatch 绘制它们。问题是当他们向左移动时,有时一些障碍物会滞后,所以看起来它会向右移动一段时间或者停止,我不知道为什么。因此,它们向左移动,一些障碍物停止一段时间,然后它们再次正确移动,然后另一个障碍物滞后一段时间,这种情况继续下去。同时屏幕上大约有 4 个障碍物,我回收了不再可见的障碍物。有人可以解释一下为什么会发生这种情况吗?我在 libGDX 示例 Thrust Copter 中也注意到了这个“bug”(您可以在LibGDX Game Development Essentials一书中找到它 - 我也为这个问题写了一个主题:LibGDX example game Thrust Copter lags)。感谢您的任何回复! :)

public class TapToJumpGame extends ApplicationAdapter {
SpriteBatch batch;
Texture obstacle;
OrthographicCamera camera;
Array<Vector2> obstacles;
Array<Vector2> usedObstacles;
double obsTime;
Vector2 lastObstacle;

@Override
public void create () {
batch = new SpriteBatch();
usedObstacles = new Array<Vector2>();
obstacle = new Texture("obstacle.png");
camera = new OrthographicCamera();
camera.setToOrtho(false, 800, 480);
resetGame();
}

private void addObstacle()
{
if(lastObstacle != null) if((810 - (lastObstacle.x + obstacle.getWidth())) < 200) return;
Vector2 obs;
if(usedObstacles.size > 0) obs = usedObstacles.pop();
else obs = new Vector2();
obs.set(810, 10);
obstacles.add(obs);
lastObstacle = obs;
}

@Override
public void render () {
Gdx.gl.glClearColor(1, 1, 1, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
updateScene();
drawScene();
}

private void resetGame() {
obstacles = new Array<Vector2>();
obsTime = 1;
lastObstacle = null;
}

private void drawScene() {
camera.update();
batch.setProjectionMatrix(camera.combined);
batch.begin();
for(Vector2 obs:obstacles)
{
batch.draw(obstacle, obs.x, obs.y);
}
batch.end();
}

private void updateScene() {

float deltaTime = Gdx.graphics.getDeltaTime();

obsTime -= deltaTime;
if(obsTime < 0)
{
obsTime = MathUtils.random()*1+.5;
addObstacle();
}

for(Vector2 obs:obstacles)
{
obs.x -= 400*deltaTime;
if(obs.x + obstacle.getWidth() < -10) {
usedObstacles.add(obs);
obstacles.removeValue(obs, true);
}
}
}
}

最佳答案

看起来,当从当前迭代的数组中删除对象时,有时会出现这些滞后峰值。

将要删除的内容存储在某处,并在迭代后将其删除,如下所示:

for (int i = 0; i < obstacles.size; i++) {
Vector2 obs = obstacles.get(i);
obs.x -= 400 * deltaTime;
if (obs.x + obstacle.getWidth() < 250) {
usedObstacles.add(obs);
obstaclesToRemove.add(obs);
}
}

for (int i = 0; i < obstaclesToRemove.size; i++) {
obstacles.removeValue(obstaclesToRemove.get(i), true);

}
obstaclesToRemove.clear();

关于java - LibGDX 游戏渲染时滞后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33532438/

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