2012-03-26 5 views
3

私は現在、Touhou-esqueの弾丸地獄のシューティングゲームを開発しています。画面には弾丸が詰まっています(インスタンシングは私がここでやりたいことです)が、これは古いハードウェア上で動作させたいので、私は現時点でこれに沿って何かをやっています。色、テクスチャ、私がこれを把握するまで、まだ。OpenGL 2Dのパフォーマンスのヒント

glVertexPointer(3, GL_FLOAT, 0, SQUARE_VERTICES); 
for (int i = 0; i < info.centers.size(); i += 3) { 
    glPushMatrix(); 
    glTranslatef(info.centers.get(i), info.centers.get(i + 1), info.centers.get(i + 2)); 
    glScalef(info.sizes.get(i), info.sizes.get(i + 1), info.sizes.get(i + 2)); 
    glDrawElements(GL_QUADS, 4, GL_UNSIGNED_SHORT, SQUARE_INDICES); 
    glPopMatrix(); 
} 

これを古いハードウェアで動作させたいので、シェーダやその他のものを避けようとしています。そこのセットアップは約80のポリゴンで私に失敗します。私はこのうち少なくとも数百を得るために探しています。 infoは、レンダリングのためのすべての機能を備えた構造体ですが、いくつかのベクターのほかには何もありません。

私はOpenGLにはかなり新しいですが、私は少なくとも聞いて試してみることができました。このゲームは2Dのゲームです。私はSDLからOpenglに切り替えました。これは、より美しいエフェクトを簡単にするためです。明らかにSDLは違った働きをしますが、私は決してそれを使ってこの問題を抱えませんでした。

これまでのところ、私は明らかに何か間違っています。古いハードウェア(OpenGL 1.x)のインスタンスを正しく実装するにはどうしたらいいですか?また、パフォーマンスを向上させるためのヒントを教えてください。

+0

GDebuggerのようなツールを使ってプロファイルを作成しましたか?それはあなたにボトルネックを教えてくれるでしょう。 – Pubby

+0

可能な限り少数の描画呼び出しを使用して、すべてを1つのVAに入れてみてください(すべての翻訳などを自分でCPU側で行います)。 – harold

答えて

9

また、パフォーマンスを向上させるためのヒントを教えてください。

あなたは、単一の巨大なテクスチャにスプライト ....

  1. ロードすべてのスプライトを使用するつもりなら。それらが合わない場合は、いくつかのテクスチャを使用しますが、テクスチャの切り替えを避けるため、テクスチャの数を少なくしてください。
  2. テクスチャを切り替え、できるだけ頻繁にOpenGL状態を変更します。理想的には、テクスチャを一度設定し、できることをすべて描画します。
  3. テキストにテクスチャフォントを使用します。 FTGLフォントは美しく見えるかもしれませんが、複雑なフォントではパフォーマンスが非常に低下します。
  4. 可能であればアルファブレンディングを避け、アルファテストを使用してください。
  5. アルファブレンディングの場合は、描画するピクセル数を減らすために常にアルファテストを使用してください。テクスチャにアルファ== 0のピクセルがたくさんある場合は、アルファテストでそれらを切り取ってください。
  6. 非常に大きなスプライトの数を減らしてください。巨大な画面整列/ピクセル整列スプライト(1024 * 1024)は非常に良いハードウェアでもFPSを落とします。
  7. 2のパワーを持たないテクスチャは使用しないでください。特定のATIカードで大幅にパフォーマンスが低下します。

2D スプライトベースのについてはglTranslatef

(おそらく、カメラ/投影行列を除く)あなたは完全に行列を避けることができたゲーム(それは重要です)。私は行列が2Dゲームであなたに大いに役立つとは思わない。

2dゲームでは、主なボトルネックはGPUメモリ転送速度になります。テクスチャからデータを画面に転送します。したがって、「描画呼び出しを少なくして使用する」と「VAにすべてを入れる」は役に立ちません.1つのスプライトでパフォーマンスを消すことができます。しかし

、あなたがベクトルグラフィックスを使用するつもりならテクスチャを使用していない、そしてアドバイスのほとんどは、上記適用されません(area2048youtube)またはrezを参照)、および、そのようなゲームはしません3Dゲームとはまったく違う。この場合、頂点配列、頂点バッファオブジェクト、または表示リスト(使用可能なものに依存します)を使用し、行列関数を利用することは合理的です。ボトルネックは頂点処理になるからです。あなたはまだ状態スイッチの数を最小限に抑える必要があります。

+0

素晴らしいヒント! "非常に大きなスプライトの数を減らす。大規模な画面整列/ピクセル整列スプライト(1024 * 1024)は、非常に優れたハードウェアでもFPSを落とします。" - 例えば、静的な背景として役立つ大きい、高解像度のスプライトを持っていて、それを使わずにしたくないのであれば、どうすればいいですか?他の選択肢はありますか? – nietaki

+0

弾丸がスクリーンを氾濫させる限り、最初から描画されたベクトルグラフィックスになります。だから私はこれを解決する現在の方法に何ができますか?答えを待っている間、私は頂点配列に切り替わり、目立った改善は見られませんでしたが、むしろすばやく完了しました。私は間違って何をしているのですか?今私はarea2048を見ています。ゲームは主にベクトルグラフィックスで構成されます。 – SpaceFace

+0

「VAにすべてを入れる」は、テクスチャ付きスプライトでも適用されます。それを信じていないのですか?それを試してみてください。 100万回のドローコールがパフォーマンスを本当に良いものにします。 – harold

関連する問題