1

編集: 3 つすべてのタイル レイヤーが画面全体を埋め尽くす場合でも、150+ fps を取得したため、2 番目のアプローチを選択しました。

編集 2: 頂点バッファー オブジェクトとそれらが静的ジオメトリにどのように最適であるかについて多くのことを読みましたが、2D タイルを VBO に変換して GPU メモリに保存する方法はまだわかりませんが、間違いなくその方法のようです他の誰かが静的ジオメトリ/クワッドをレンダリングする高速な方法を探している場合に行ってください。

私は Super Meat Boy のようなゲームを作成していますが、レベル タイルを配列リストに格納し、カメラ境界オーバーラップ テストを実行してレンダリングする必要があるかどうかを確認する方が良い/速いかどうか疑問に思っていました。

foreach(Tile tile in world.tiles) {
    if(Overlap(camera.bounds, tile))
        render(tile);
}

それとも、すべてのグリッド スクエアを格納し、カメラの境界間のみを読み取る 2D 配列の方がよいでしょうか?

int left = (int)(camera.position.x - camera.width/2);
int right = (int)(camera.position.x + camera.width/2) + 1;
int top = (int)(camera.position.y - camera.height/2); // WHY XNA DO YOU UPSIDE DOWN!!!
int bottom = (int)(camera.position.y + camera.width/2) + 1;
for(int x = left; x < right; x++) {
    for(int y = top; y < bottom; y++) {
        render(world.tiles[x][y]);
    }
}

カメラは画面上に 64*36 のタイルを収めることができますが、後者のアプローチを使用すると 2300 個の奇数タイルを読み取ることができますが、レベル内のすべてのタイルでオーバーラップ テストを行っていますか? 一致する隣接するタイルをより大きなクワッドに結合し、テクスチャを繰り返すことについての回答を読みました (ただし、テクスチャ アトラスを使用しているため、テクスチャ上の領域を繰り返す方法がわかりません)。

乾杯。

4

1 に答える 1

0

私の過去の経験から、詳細を共有できます。2D マップでは、通常、マップの長さは 0 ~ N のようになります。現在、N は画面サイズよりもはるかに長いです。今、最初はすべてを一度にロードしようとしました。しかし、それは少しオーバーヘッドです。わかりました、それは非常に多くのオーバーヘッドのようでした。そして、私は0 FPSで終わります。私は私のために別の種類のオブジェクトが欲しいので。そのため、同じオブジェクトを繰り返してメモリを節約しても機能しません。次に、画面を参照して境界付けてみました。したがって、オブジェクトは存在しますが、レンダリングされません。そのため、ドローパイプラインから離れた場所に移動します。そして、ゲームは生き返ります。

ここで、C# 4.0 でさらにパフォーマンスを高めるために、TPL と async を使用し、draw で await を使用できます。これは、スレッド化の改良版のようなものです。したがって、そこに物を投げて、自由にレンダリングさせることができます。

ここでは、XNA またはその他のグラフィック ライブラリを扱います。完全なグラフィック レンダリング パイプラインがあります。そして、それは物事を非常に遅くします。具体的には、PC が古く、ワイド スクリーンのみをサポートするために 64MB のグラフィック カードしかない場合。あなたのゲームはどんな種類のマシンにも展開されますよね??!!

ですから、XNA の言語で説明すると、更新は単純なコードであり、できるだけ速く実行されれば、それを止めるものは何もありません。しかし、draw にはその前に完全なパイプ ラインがあります。そして、それが始まりと終わりがある唯一の理由です。そのため、終了後、物事をパイプラインにプッシュし始めることができます。[こちら] ( http://classes.soe.ucsc.edu/cmps020/Winter11/readings/hlsl.pdf ) 参照用の記事。

したがって、ここではレンダリング パイプラインが必要ですが、遅くてブロックする必要はありません。マルチスレッドにするだけで、物事はかなり速くなります。もっと簡潔にしたい場合は、リンクリストなどを含めてC#を最大限に使用する必要があります。しかし、それは最後の段階のようになります。

回答を提供するのに十分な詳細を提供できたことを願っています。さらに詳細が必要な場合はお知らせください。

于 2013-08-09T05:46:27.937 に答える