2013-11-14 9 views
8

私たちは(少なくとも希望で)インディーズゲームを開発したいAndroidのみのゲーム:ジャワ(のDalvik)対C++(NDK)でのパフォーマンス

同様の質問が以前に求められていることを知っているが、...それでも画面上にオブジェクトを移動させるためのものではないにしても、何百もの高品質のグラフィックを持つゲームです。したがって、非常に多くのポリゴンとヒットテストやAIの必要条件が必要です。

私はJavaの基本的な問題がガベージコレクションであることを知っています。しかし、それは問題ではありません。ゲームが始まる前に必要なメモリをすべて割り当てる予定です。一時オブジェクトに対しては、プールを使用します(ゲームループでは、新しいキーワードは決して書き込まれません)。そしてここで言及されているすべてのテクニックを使用する予定です(Google I/O 2009 - Writing Real-Time Games for Android)。

我々は、Javaを主張する主な理由は、展開であり、我々は唯一のアンドロイドのために開発したい(のために今少なくとも)

それは醜い意味さえあればゲーム内で同じパフォーマンスは、Java(とachivedすることができます/慣用コードではありません)。そうでない場合、具体的な内容は何ですか?おそらくそれが可能だが、非常に実用的でない場合、これらの理由は何ですか?

(例えば、私はJavaのバッファについて何かを読んで、OpenGLは最高のペアリングではなく、詳細を覚えていない - おそらくいくつかの専門家)

答えて

10

あなたがに呼び出しごとに固定の追加コストを支払うことになるだろうJavaソースコードからOpenGLを使用する。 Androidは呼び出しの周りにJava言語のラッパーを提供します。たとえば、glDrawArraysを呼び出す場合はGLES20.javaで宣言されたネイティブメソッドを呼び出しています。これはandroid_opengl_GLES20.cppで定義されています。コードからは最小限のオーバーヘッドで通話を転送するだけであることがわかります。

ファイル内を巡って、追加のチェックを実行するため、やや高価な他の呼び出しを見ることができます。

まで不可避であるは、GLESの呼び出しをたくさん作成することの価格は、Javaソースがネイティブソースよりも高いということです。 (Android Breakoutのパフォーマンスはsystraceですが、私は多くの冗長な状態アップデートを行っていたため、ドライバにCPUオーバーヘッドが多く発生していたことに気付きました。ネイティブコードからそうするコストは低くなりましたが、 )ゼロの作業をすることは、より少ない労力を費やすコストよりも安いです。

もっと深い疑問は、コードを違うように書く必要があるかどうかです(例えば、割り当てを避けるために)パフォーマンスのレベル。単純な配列ではなく、直接ByteBufferオブジェクトで作業する必要があります。しかし、計算量の多いネイティブコードとAndroidのJavaコードとの現在の速度の違いを除いて、私は基本的に厳密にJava実装からの優れたパフォーマンスを妨げるものは認識していません。

関連する問題