web-dev-qa-db-ja.com

Androidゲーム:CanvasまたはOpenGL?

私はAndroid用のゲームを書くことになっていて、描画するにはCanvasまたはOpenGLのどちらかを選択する必要があります。 Canvasのフレームレートが良くないことを読みましたが、何が良いのでしょうか。 Angry Birdsタイプのゲームを作成しようとしていると想像してみてください。キャンバスのフレームレートで十分でしょうか?

21
seipey

最初はCanvasを使用してゲームを作成しましたが、次の理由でOpenGLに切り替える必要がありました。

  • Canvasを使用すると、スプライトはヒープに保存されます(特にディスクにキャッシュしない限り)。これにより、電話によってはスプライトアセットの合計サイズが制限されます。これは良くありません。私はこれが私の電話で約42MBであることがわかりました-これはビットマップの非圧縮サイズであることに注意してください。アニメーションがそれぞれ異なる複数のタイプのエンティティがある場合は、このサイズにすばやく到達できます。

  • OpenGLは、スプライトアセットをヒープに個別に保存するため、使用可能なメモリが大幅に増加します。

  • Canvasはあまりスケーリングしません。 .draw(...)を呼び出す回数が多いほど、実行速度は遅くなります。関係はかなり線形です。

  • OpenGLを使用すると、描画呼び出しをまとめてバッチ処理してパフォーマンスを向上させることができます。

Canvasを魅力的に見せているOpenGLから始めるのは恐ろしいかもしれません。しかし、経験から、OpenGLを始めたばかりだったらよかったのにと思います。ゲームを作成している場合は、「弾丸を噛んで」OpenGLを使用することをお勧めします。

作業を少し簡単にするために、すべての重要なOpenGLを実行する便利なユーティリティクラスをいくつか作成しました。 Canvasを使用する場合と同様に、単純な.draw(..)呼び出しを行うことができます。次のビデオチュートリアルで始めることができます。

http://www.youtube.com/watch?v=xc93rN2CGNw

編集:03/04/13

新しいAndroidデバイスとオペレーティングシステムが登場するにつれて、GoogleはCanvasのパフォーマンスを向上させたようです。上記のユーティリティクラスのユーザーは、ベンチマークを行った後、次のメールで私に返信しました。 :

フレームごとにキャンバス全体のランダムな位置に500個のスプライトを描画します。

結果は次のとおりです。HuaweiHonor(Gingerbread、シングルコア1.4 Ghz):SpriteBatcher:19-20 FPS、Canvas:23-24 FPS

Nexus 7(JellyBean、4コア1.3 Ghz):SpriteBatcher:29-30 FPS、Canvas:57-58 FPS

さて、このユーザーへの返信で、これはユーティリティクラスSpriteBatcherを記述した方法の非効率性に関係している可能性があることを説明しました。ただし、Froyo2.2を実行しているHTCDesireでCanvasを使用した私自身の経験から、Spriteの場合は間違いなく遅いSpriteだったと言えます。

後のオペレーティングシステムとデバイスでは、効率を上回っている可能性がありますが、元の応答のいくつかのポイントはまだ有効です。たとえば、ディスクへのテクスチャのキャッシュなどに頼ることなく、OutOfMemoryExceptionをヒットすることを回避できます。

私がもっと学ぶならば、私はこの答えを更新し続けます。

49
Twice Circled

それはすべて、実装する必要のあるゲームの種類によって異なります。

キャンバスの実装を求めていることを考えると、純粋な2Dスプライトゲームを参照していると思います。

スプライトの数が少なく、数が非常に少ない場合、実際には大きな違いに気付く可能性があります(基本的な2Dグラフィックスを使用する多くのゲームがキャンバスを使用していることを考慮してください)。

パフォーマンスが重要な場合、またはスプライトの数が非常に多い場合は、OpenGLベースのシステムを実装する価値があります。

OpenGLを使用すると、GPU専用ハードウェアのメリットが得られるため、CPUからグラフィックスレンダリングの負担が軽減されることを考慮してください。

さらに、ブレンディング、ライティング、後処理効果を使用したキャンバスの実装よりもはるかに柔軟性があります。あなたができることには本当に制限はありません。

簡単な例は、OpenGLなどの3Dエンジンを使用すると非常に安価で、優れた結果が得られる回転とスケーリングです。

単純な実装には、Canvasを実際に採用する必要があります。

P.S. OpenGL ES 2.0とプログラム可能なパイプラインを使用する場合、達成するものに実際には制限はありません(グロー、ブラー、および数千の異なるオプション)。その場合、限界は本当に私たちのファンタジーです。

:)

4

あなたがそのような大きなゲームをするつもりなら、あなたは間違いなくAndEngineの使用を検討するべきです: http://www.andengine.org/

正しく使用すれば、それは大きな助けになります。残念ながら、コードにはドキュメントがありません。しかし、サイトのフォーラムは大丈夫です。そして、ここでもSO AndEngineに関する質問がますます増えています。幸いなことに、始めるための良い例がたくさんあります。

AndEngineはOpenGLを使用しているため、キャンバスに描画するときにフレームレートが低くなる可能性があるため、いじくり回す必要はありません。

アプリの例を確認してください: https://market.Android.com/details?id=org.anddev.andengine.examples

1
mseo