java - LibGDX 游戏渲染时滞后

标签 java libgdx

我有一个障碍物数组(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/

相关文章:

java - 在 Java 中对包含百万个数字的数组进行排序

java - 有人能告诉我为什么A也变了吗?

java - 如何运行一个在执行 main 方法后继续工作的测试类

android - Android 应用程序崩溃时处理对象的正确方法是什么?

Java Apache POI 和 JDBC : Smart way to fetch huge amount of data into Excel

java - Jaxb 元素属性选择

java - Libgdx scrollPane 在我添加 scrollPaneStyel 后不滚动

java - 我想使用 assetmanager 来处理图像

java - LibGDX TmxMapLoader 无法解析

java - Android 中的应用程序有不同的外观吗?