2012-04-08 4 views
4

私はJavaからOpenGLを使い始めています。多くのglBegin()とglEnd()呼び出しの間にたくさんのコードを置く必要がある状況に遭遇しています。コードがautoどのコードがどのglBegin/glEndに属しているかを一目で容易に見ることができるようにフォーマットされている。これを実現するためにJavaでコードブロックを使用するとパフォーマンスに影響はありますか?

は、私はこのように、匿名のコードブロックを使用していた:

glBegin(GL_QUADS); 
{ 
    glVertex2f(100, 100); 
    glVertex2f(100+200, 100); 
    glVertex2f(100+200, 100+200); 
    glVertex2f(100, 100+200); 
} 
glEnd(); 

私の質問は:パフォーマンスの懸念がある、でも極めて軽微な場合には、このようにコードブロックを使用するために?あるいは、プログラムがコンパイルされたらコードブロックを一切使用しないのと同じですか?

+6

パフォーマンスが心配な人は、現代のOpenGL技術を実際に使用しているはずです。 VBO(OpenGL 1.5+)を使用することによるパフォーマンスのメリットは、即時モードレンダリングを中心にすべてを最適化しようとする試みよりも桁違いに大きくなります。 –

+0

あなたのコードを読んだ人は、なぜそれらの呼び出しが異なるスコープにあるのか混乱するかもしれないということを考慮する必要があります。 – gsingh2011

+0

実際、私はそれほど頻繁にブロックを使用しました。スコープとは少し関係がありますが、読みやすくするためにはさらに関係します。そうですね、私は読むのが簡単で、私の同僚についてはわかりません:-)。 – Robinson

答えて

6

このようなブロックを使用するコストはかかりません。ブロックはスコープ目的で使用される言語の構文上の特徴であり、関連する実行時機能はありません。 JVMによってコンパイルされたバイトコードを見ると、関数のスコープルールが何であるかを知る方法がないため、JVMはブロックの有無にかかわらず同じパフォーマンスを与える必要があります。

読むのが簡単だと思われる場合は、自由にしてください。実際には、そうでないと疑う理由がない限り、ほとんどの場合、あなたの優先事項になるはずです。

希望すると便利です。

+0

実際には、ブロックの存在がJavaプログラムのセマンティクスに何の影響も及ぼしていないか、またはルールを変更しているので、これを行うのは難しい方法でもないと確信しています(Javaではブロックで宣言された変数ローカル変数、したがって私たちは2つの異なる変数 'x'を持つことはできません) – Voo

+0

@ Voo-もしあなたが複数のスコープで同じ変数を宣言したならば、クラスファイルのシンボルで何かをする可能性があります。 – templatetypedef

+0

どうしたらいいですか?私は最初も分からなかったので、私はチェックして '{int x; {char x;}} 'はコンパイルエラーを返します。だから私はインナーブロックのローカル変数をシャドウすることはできません。そのようなことを許した言語でセマンティクス(または少なくともコード)を変更できる唯一のものだと思います。 – Voo

1

ブロックにローカル変数を宣言しない場合は、ローカルブロックをまったく使用しないでください。自分自身を含めてコードを読んで維持しなければならない人々に混乱を引き起こす可能性を除いて、そうすることによって何も得られません。

ローカルブロックは、メソッド内の短命オブジェクトを宣言するのに便利です。オブジェクトは、ブロックの持続時間内にスコープ内に留まるだけです。それでも、メソッドが終了する前にガベージコレクションが行われることを保証するものはありません。

パフォーマンス最適化としてローカルブロックを使用することは妥当ではありません。このようなマイクロ最適化を実行するのではなく、アプリケーションをプロファイリングして、維持する。

可読性を向上させるためにローカルブロックを使用することは議論の余地がありますが、ブロック内で実行されているコードのスコープに関する問題を引き起こし、おそらく見つけにくいバグを生成する可能性があります。

わかりやすさのために、それぞれの前後によく置かれたコメントのいくつかは、なぜglBegin()glEnd()の間にはありませんか?

+0

いくつかのOpenGLコードを書いたことはありますか? (そうでない場合は、* old * openGLコードの通常の構造に気づいていないかもしれません)私は一般的には、私がC++ OpenGLコードを書いたときに 'glBegin/End'をインデントして同様のコードをたくさん見ました。それは構造を強調するのに役立ちます。そうでなければ、かなり混乱し、コメントが役に立たないことがあります。また、Javaでは、追加のローカルスコープ(afaics)を導入することによってコードの意味的意味を変更することは不可能であるため、誰もが混乱するとは思わない。 – Voo

+0

あなたはどちらも正しいです。 – Robinson

5

glVertexを無制限に呼び出すと、他の何よりもパフォーマンスに影響があります。それが本当の懸念であるはずです。頂点配列と頂点バッファオブジェクトを調べて、の実数のパフォーマンスを向上させます。また、あなたのコードはより良く見えます。

関連する問題