7

OpenGL ES を使用して iPhone 用の 2D ゲームを開発しています。永続的な背景として 320x480 のビットマップ イメージを使用したいと考えています。

私が最初に考えたのは、320x480 のクワッドを作成し、その上に背景を表すテクスチャをマップすることでした。それで... 320x480 の画像を含む 512x512 のテクスチャを作成しました。次に、それを 320x480 クワッドにマッピングしました。

この背景をフレームごとに描画し、その上にアニメーションのスプライトを描画します。これらすべてのオブジェクト (背景 + スプライト) の描画が遅すぎることを除けば、これは問題なく機能します。

いくつかのテストを行ったところ、速度低下がピクセル パイプラインにあることがわかりました。当然のことながら、大きな背景画像が主な原因です。これを証明するために、背景の描画を削除し、他のすべてのレンダリングが非常に高速になりました。

バックグラウンドを維持し、パフォーマンスを向上させる方法についてアドバイスを求めています。

詳細は次のとおりです。

1) 私は現在、シミュレーターでテストしています (Apple からライセンスを待っています)。

2) 背景は 128k に圧縮された PVR テクスチャです。

3) この背景をカラー バッファにキャッシュする方法があるのではないかと期待していましたが、うまくいきませんでした。それは私の OpenGL ES の経験不足によるものかもしれませんし、うまくいかないばかげた考えかもしれません :)

4) 背景全体を常に更新する必要はなく、移動するスプライトによって描画された部分だけを更新する必要があることに気付きました。背景の一部を(必要に応じて)別のテクスチャとして、またはシザー ボックスを使用して更新する手法を調べ始めましたが、これはエレガントとは言えません。

ヒント/アドバイスをいただければ幸いです...

ありがとうございました。

4

6 に答える 6

8
  1. シミュレータでパフォーマンステストを行わないでください。これまで!
    実際のハードウェアとの違いは非常に大きいです。両方向に。
  2. フレームごとに背景を描画する場合:
    フレームバッファをクリアしないでください。とにかく背景は全体を上書きします。
  3. 本当に背景のテクスチャが必要ですか?
    頂点カラーを介してカラーグラデーションを使用するのはどうですか?
  4. テクスチャに2ビットモードを使用してみてください。
  5. 背景に必要のないすべてのレンダリング手順をオフにします。
    例:照明、ブレンディング、深度テスト、..。

あなたがあなたの描画コードのいくつかを投稿することができれば、それはあなたを助けるのがはるかに簡単でしょう。

于 2009-01-13T19:21:57.463 に答える
5

2D ゲームを作成している場合、既存のライブラリを使用しない理由はありますか? 具体的には、iPhone 用の cocos2d は時間をかける価値があるかもしれません。問題をすべて自分で解決する方法についての質問には答えられませんが、cocos2d を使用して、あなたが話していること (スプライトを上に配置した 1 つのフルスクリーン背景を持つこと) を正確に実行したと言えます。すごい。(60 fps が十分に高速であると仮定します。) 自分でそれを行う理由があるかもしれませんが、可能であれば、少なくとも cocos2d で簡単なプロトタイプを作成し、それが役に立たないかどうかを確認することを強くお勧めします。(iPhone版の詳細とソースはこちら: http://code.google.com/p/cocos2d-iphone/ )

于 2009-01-13T17:57:51.360 に答える
3

これについて情報を提供してくれたすべての人に感謝します。すべてのアドバイスは、何らかの形で役立ちました。

ただし、ここでの主な問題は、シミュレーター自体の動作であることが判明したことを明確にしたいと思いました (Andreas の応答で暗示されているように)。デバイスでアプリケーションを取得できるようになると、パフォーマンスが大幅に向上しました。これについて言及したのは、ゲームを開発する前に、デバイスがシミュレーターよりもはるかに遅いことを示す多くの投稿を見たからです。これは一部のインスタンス (一般的なアプリケーション ロジックなど) には当てはまりますが、私の経験では、アニメーション (特に 3D 変換) はデバイス上ではるかに高速です。

于 2009-03-20T16:44:19.987 に答える
1

OpenGL ES の経験はあまりありませんが、この問題は一般的に発生します。

「カラーバッファ」についてのあなたの考えは直感的です。基本的には、背景をフレームバッファとして保存し、前景を描画する前にレンダリングバッファに直接ロードしたいと考えています。

OpenGL では、フレーム バッファ オブジェクト (FBO) を使用すると、これはかなり簡単です。残念ながら、OpenGL ES がそれらをサポートしているとは思いませんが、どこかで探し始めることができるかもしれません。

于 2009-01-13T00:02:12.500 に答える
0

VBO(頂点バッファオブジェクト)を使用してみて、速度が上がるかどうかを確認することをお勧めします。チュートリアルはこちら

さらに、OpenGL ES v1.1以降、glDrawTex(Draw Texture)と呼ばれる関数があります。

ゲーム内の背景画、ビットマップフォントグリフ、および2Dフレーミング要素の高速レンダリング

于 2009-01-13T14:26:35.313 に答える
0
  1. Apple の GLPaint の例に似たフレーム バッファ オブジェクトを使用できます。
  2. テクスチャ アトラスを使用して、作成する描画呼び出しの数を最小限に抑えます。glTexCoordPointer を使用して、各画像を正しい位置にマップするテクスチャ座標を設定できます。頂点バッファも忘れずに設定してください。理想的には、1 回の描画呼び出しで 2D シーン全体をレンダリングします。
  3. 可能であれば、状態を有効/無効にすることは避けてください。
于 2009-03-06T12:42:25.117 に答える