【问题标题】:LibGDX game lags when renderingLibGDX 游戏在渲染时滞后
【发布时间】:2015-11-06 18:19:00
【问题描述】:

我有一组障碍物(Vector2 对象中的Array),它们从屏幕右侧移动到左侧,因此在每次调用 render() 函数时,我都会将它们的 x 位置减少 400*deltaTime值,然后我使用SpriteBatch 绘制它们。问题是当他们向左移动时,有时会有一些障碍物滞后,所以看起来它向右移动了一段时间或停止了,我不知道为什么。所以他们向左移动,一些障碍物停止了一段时间,然后他们再次正确移动,然后另一个障碍物滞后了一段时间,这种情况继续下去。同时屏幕上大约有 4 个障碍物,我回收了不再可见的障碍物。有人可以解释一下为什么会这样吗?我在 libGDX 示例 Thrust Copter 中也注意到了这个“错误”(您可以在 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);
            }
        }
    }
}

【问题讨论】:

  • 可以放相关代码吗?这将有助于识别问题
  • 我编辑了它,所以我添加了代码。 :)

标签: java libgdx


【解决方案1】:

从当前迭代的数组中移除对象时,似乎有时会出现这些延迟峰值。

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

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();

【讨论】:

  • 非常感谢! :) 问题是我正在从 Array 中删除对象,正如您所说,该对象当前正在迭代。你真的帮了我!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-12
  • 2020-01-29
  • 1970-01-01
  • 2014-10-24
  • 2013-03-12
相关资源
最近更新 更多