4

私はJavaからOpenGLを使い始めていますが、多くのglBegin()呼び出しとglEnd()呼び出しの間に多くのコードを配置する必要があり、コードを次のように自動フォーマットしたいという状況に遭遇しています。どのコードがどのglBegin/glEndに属しているかが一目でわかります。

これを達成するために、私は次のような匿名のコードブロックを使用しています。

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

私の質問は、この方法でコードブロックを使用することについて、たとえ非常にマイナーであっても、パフォーマンス上の懸念はありますか?それとも、プログラムのコンパイル後にコードブロックをまったく使用しないのと同じですか?

4

3 に答える 3

6

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

読みやすいと思われる場合は、これを自由に行ってください。実際、他に疑う理由がない限り、ほとんどの場合、それを優先する必要があります。

お役に立てれば!

于 2012-04-08T20:02:18.257 に答える
5

glVertex への数え切れないほどの呼び出しは、何よりもパフォーマンスに影響を与えます。それがあなたの本当の関心事です。実際のパフォーマンスを向上させるために、頂点配列と頂点バッファー オブジェクトを調べてください。また、あなたのコードは見栄えが良くなります。

于 2012-04-08T20:19:55.380 に答える
1

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

ローカル ブロックは、メソッド内で有効期間が短いオブジェクト (ブロックの期間中のみスコープ内に留まるオブジェクト) を宣言するのに役立ちます。それでも、メソッドが終了する前にガベージ コレクションが行われるという保証はありません。

パフォーマンスの最適化としてローカル ブロックを使用することは意味がありません。コードの読み取りと保守が困難になるこのようなマイクロ最適化を実行するよりも、アプリケーションをプロファイリングし、遅いことが証明されている部分を調整する方がよいでしょう。

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

glBegin()読みやすくするために、各との前後に適切に配置されたコメントをいくつか付けてみませんglEnd()か?

于 2012-04-08T20:12:54.107 に答える