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 中のオブジェクト割り当て (別名 new ) を避けることです。「新しい」ものはすべて、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 に答える