0

嗨,我正在做无尽的横向卷轴游戏,其中地形看起来像一个无限的隧道。我设法使用以下代码随机生成隧道:

private void createPaths() {    
    if(startingPath) {
        pathBottom.setLastPoint(0, canvasHeight);
        pathTop.setLastPoint(0, 0);

        slopeWidth = 0;
        slopeHeight = generateRandomNumber(canvasHeight / 4, canvasHeight / 2);

        lastX = 0;
        lastY = canvasHeight - slopeHeight;
        newX = lastX;
        newY = lastY;

        startingPath = false;
    } else {
        lastX = canvasWidth;
        lastY = newY;
        newX = lastX;
        newY = canvasHeight - slopeHeight;
    }

    pathBottom.lineTo(lastX, lastY);
    pathTop.lineTo(lastX, lastY - OFFSET);

    do { 
        lastX = newX;
        lastY = newY;

        slopeWidth = generateRandomNumber(canvasWidth / 8, canvasWidth / 2);
        newX += slopeWidth;

        if(i % 2 == 0) {
            slopeHeight = generateRandomNumber(canvasHeight / 12, canvasHeight / 6);
            newY = canvasHeight - slopeHeight;
        } else {
            slopeHeight = generateRandomNumber(canvasHeight / 4, canvasHeight / 2);
            newY = canvasHeight - slopeHeight;
        }

        pathBottom.cubicTo(
                interpolateLinear(lastX, newX, 0.333f),
                lastY,
                interpolateLinear(lastX, newX, 0.666f),
                newY,
                newX,
                newY);
        pathTop.cubicTo(
                interpolateLinear(lastX, newX, 0.333f),
                lastY - OFFSET,
                interpolateLinear(lastX, newX, 0.666f),
                newY - OFFSET,
                newX,
                newY - OFFSET);
        i++;
    } while (newX < canvasWidth * 2);
    pathBottom.lineTo(newX, canvasHeight);
    pathTop.lineTo(newX, 0);
}

并使用以下方法滚动它:

public void updateTerrain() {
    moveX -= speed;
    int pos = newX - canvasWidth + moveX;
    if(pos > 0) {
        Matrix matrix = new Matrix();
        matrix.setTranslate(-speed, 0);
        pathBottom.transform(matrix);
        pathTop.transform(matrix);
    } else {
        createPaths();
        moveX = 0;
    }
}

问题是:路径越长,游戏就越“断断续续”。我认为我应该在一段时间后减少路径中绘制的点,但老实说我不知道​​该怎么做,仍然让地形滚动和生成。如果你能帮助我,我将不胜感激。谢谢。

4

1 回答 1

1

这看起来像是一大块逻辑的一小部分。性能问题可能在于此处未显示的其他代码。

一般建议(根据 Romain Guy 和 Chet Haase 等人的说法)是在 onDraw 期间避免对象分配(又名新)。任何“新”都有可能触发 GC。

我会重新使用相同的 Matrix 实例并对其进行更新。

另外,正如fadden 提到的“固定大小的滑动窗口结构”(类似于循环缓冲区或环形缓冲区)上面的评论,您应该确保您的 Path 对象是固定大小的。

  1. 为路径选择固定数量的点(比如说 200)
  2. 跟踪数组中的这些点并保留一个“startindex”变量来跟踪数组的“逻辑”开始。当您需要添加新点时,以数组大小为模递增索引,覆盖最后一个点(索引 - 1 以数组大小为模)。当您到达数组的末尾时,您必须换行(从头开始并转到 startindex - 1 )。
  3. 在创建视图时使用 path.incReserve 预分配内存。
  4. 使用 path.rewind 重置路径
  5. 然后重新使用相同的 Path 实例,从点数组中重新添加所有点(从“startIndex”开始)
于 2014-05-26T00:58:41.093 回答