10

以前にも同様の質問があったことは知っていますが...

私たちはインディー ゲームを開発したいと考えています (少なくとも希望はあります) が、画面上に数千とは言わないまでも数百の移動オブジェクトを備えた高品質のグラフィックスを備えたゲームを開発したいと考えています。

Java の基本的な問題はガベージ コレクションであることはわかっています。しかし、それは問題ではありません。ゲームの開始前に必要なすべてのメモリを割り当てる予定であり、一時的なオブジェクトにはプーリングを使用します (そのため、ゲーム ループでは新しいキーワードが書き込まれることはありません)。また、ここで言及されているすべての可能な手法を使用する予定です ( Google I/O 2009 - Android 用のリアルタイム ゲームの記述)。

私たちが Java に固執する主な理由はデプロイメントであり、Android 向けにのみ開発したいと考えています (少なくとも現時点では)。

そのため、Java を使用しても、C++ を使用した場合と同じパフォーマンスをゲームで実現できます (それが醜い/慣用的なコードではないことを意味する場合でも)。そうでない場合、詳細は何ですか?あるいは、可能ではあるが非常に非現実的である場合、これらの理由は何ですか?

(たとえば、Java Buffers と OpenGL は最適なペアリングではありませんが、詳細は覚えていません - 専門家かもしれません)

4

1 に答える 1

10

Java ソース コードから OpenGL を使用するには、呼び出しごとに一定の追加料金が発生します。Android は、呼び出しの周りに Java 言語のラッパーを提供します。たとえば、 を呼び出す場合は、 Android_opengl_GLES20.cppで定義されているGLES20.javaglDrawArraysで宣言されたネイティブ メソッドを呼び出しています。コードから、最小限のオーバーヘッドで呼び出しを転送しているだけであることがわかります。

ファイルの中をうろつくと、追加のチェックを実行するため、わずかにコストがかかる他の呼び出しを確認できます。

避けられないコストに関する限り、肝心なのは、多くの GLES 呼び出しを行うコストは、ネイティブ ソースよりも Java ソースの方が高いということです。( systraceを使用したAndroid ブレイクアウトのパフォーマンスを見ていると、冗長な状態の更新を何度も行っていたため、ドライバーで CPU のオーバーヘッドが大きいことに気付きました。ネイティブ コードから実行した場合のコストは低かったでしょうが、仕事をゼロにするコストは、仕事を少なくするコストよりも少ない。)

より深い問題は、同じレベルのパフォーマンスを単純に得られないほど (たとえば、割り当てを避けるために) コードを異なる方法で記述する必要があるかどうかに関係しています。単純な配列ではなく、直接ByteBufferオブジェクトを使用する必要があります。これには、もう少し管理が必要になる場合があります。しかし、計算集約型のネイティブ コードと Android 上の Java コードとの間の現在の速度の違いは別として、厳密に Java の実装による優れたパフォーマンスを根本的に妨げるものは何も認識していません。

于 2013-11-14T19:31:28.950 に答える