2012-06-15 8 views
10

私はC++でSDLを使用して2Dプラットフォームゲームを作成しています。しかし、私は解像度にスケーリングを伴う大きな問題に遭遇しました。ゲームの全解像度が1920x1080になるように、ゲームのすべての画像が作成されているように、ゲームをフルHDで美しく見せてください。しかし、誰かが小さい解像度を使用している場合はゲームを正しい解像度に縮小し、大きい解像度を使用している場合は拡大するようにします。SDLで解像度に合わせる方法は?

問題は効率的な方法を見つけることができなかったことです。すべての画像をプレスケールするためにSDL_gfxライブラリを使用して始めましたが、これは多くのオフラインを作成するため動作しません1つのピクセルが失われていた1つのエラー。そして、私のアニメーションは、アニメーションが再生されるときに1つの画像に含まれるので、アニメーションは各フレームの上下にわずかに移動します。

次に、私はいくつか見て回った後、スケーリングを処理するためにopenglを使ってみました。現在、私のプログラムはすべての画像を1920x1080のSDL_Surfaceに描画します。次に、このサーフェスをOpenGLテクスチャに変換し、このテクスチャを画面解像度に合わせてスケーリングし、次にテクスチャを描画します。これは視覚的にはうまく動作しますが、問題は効率的ではないことです。現在、私は18 :(

の最大のFPSを取得していますので、私の質問は、誰もが画面の解像度にSDLディスプレイを拡張するための効率的な方法を知っているんですか?

+1

あなたはOpenGLを使用しているときに、あなたの描画、変換、スケーリングを実行していますか? – silent

+0

また、gamedevフォーラムのメンバーにお尋ねください、彼らはあなたを助けることができるはずです。 – silent

+0

はい、私はそれがとても非効率な理由です。しかし、現在私はそれが動作する他の方法を見つけることができません。 OKを実行します。 –

答えて

10

それは非効率的だのOpenGLがいることを動作するように設計されていなかったので、途中、現在のデザインの主なパフォーマンスの問題:。

  • まず問題:あなたはSDLとのソフトウェアラスタライズだ申し訳ありませんが、関係なく、あなたがこの構成では何をすべきか、それがボトルネックになりません1920×1080の解像度で、。あなたは、2つの4チャンネルピクセルをシェーディングするために10クロックサイクルがかかると仮定すると、2GHzプロセッサでは、 最大は96.4fpsです。あなたはおそらくを除いて悪くはありませんそれは速く、あなたはまだAI、ユーザー入力、ゲームのメカニック、サウンド、物理学、および他のすべてを行っていない、あなたはおそらくとにかく少なくとも一度はいくつかのピクセルを描画します。 SDL_gfxは速いかもしれませんが、大きな解像度の場合、CPUは基本的に過度のタスクを過ぎてしまいます。
  • 第2の問題:各フレームでは、グラフィックバスを介してGPUにデータをコピーしています。これは、グラフィックスで可能な限り最も遅いことです。イメージデータはおそらくの最悪のものです。そのうち多くは典型的なものですから、です。基本的に、各フレームは、GPUにRAMからVRAMに200万画素をコピーするように指示しています。 Wikipediaによれば、2,073,600ピクセルのそれぞれ4バイトで258.9fpsを超えることはないと思います。

私の推奨事項:アプリケーションをOpenGLに完全に切り替えてください。これにより、テクスチャにレンダリングして画面にコピーする必要がなくなり、画面に直接レンダリングできます!また、スケーリングはビューマトリックス(glOrtho/gluOrtho2D for 2D)によって自動的に処理されるので、はスケーリングの問題について全くに気にする必要はありません。ビューポートはすべて同じスケールで表示されます。 これはあなたの問題に対する理想的な解決策です。

ここでは、OpenGLの描画コマンド(作業はそれほど難しくない、特に長期的には)ですべてをコード化しなければならないという大きな欠点があります。それを短くすれば、スピードを上げるために以下のアイデアを試すことができます:

  • PBOs。ピクセルバッファオブジェクトは、テクスチャのロード/コピーを非同期にすることで、問題2を解決するために使用できます。
  • レンダリングをマルチスレッド化します。ほとんどのCPUは少なくとも2つのコアを持ち、新しいチップでは2つのレジスタ状態を1つのコアに保存することができます(Hyperthreading)。 GPUがどのようにレンダリングの問題を解決するのかを本質的に複製しています(スレッドがたくさんある)。私はスレッドセーフなSDL_gfxがどういうものなのかよくわかりませんが、何かがうまくいくかどうかは確かです。特に、画像の異なる部分だけで同時に作業している場合はそうです。
  • あなたの描画面がSDLにある場所に注意してください。おそらくSDL_SWSURFACEでなければなりません(あなたがCPU上に描画しているためです)。
  • VSyncを削除します。これは、60Hzで動作していなくても、パフォーマンスを向上させることができます。
  • 元のテクスチャを描画していることを確認します。新しいテクスチャに拡大縮小しないでください。別のサイズで描画し、ラスタライザで作業をさせてください!
  • 散発的に更新:一度にイメージの半分のみを更新します。これは恐らくあなたの "フレームレート"の2倍に近くなり、(通常)目立ちません。
  • 同様に、画像の変化する部分のみを更新します。

これが役に立ちます。

+0

SDL 2.0がリリースされ、3Dアクセラレーション「水中」が使用されています。これはおそらくあなたのパフォーマンスを助けるかもしれませんか? –

関連する問題