16. ディスプレイリストと頂点配列

16.010  ディスプレイリストがたくさんの記憶容量を使うのはなぜですか?

OpenGLディスプレイリストはすべてのデータのコピーをそれにしなければなりません それを作成した呼び出し連続を再生するために必要とする 。 これは、すべてのglVertex3f()呼び出し、例えばディスプレイリストのために記憶装置を3つの値に提供しなければならないのを意味しています(普通、32ビットフロートはほとんどのインプリメンテーションにおいて見積もります)。 これは、典型的なディスプレイリストにより使われたメモリーのほとんどが行く所です。

しかし、ほとんどのインプリメンテーションには、与えられた文脈および他のオーバーヘッドのディスプレイリストを管理する必要があったいくらかのメモリーもあります。 一定の病理学のケースでは、ディスプレイを蓄えるために用いられたメモリーが、データをリストしたよりこの頭上のメモリーは大きいかもしれません!

16.020  異なるコンテキスト間でディスプレイリストを共有するにはどうしたら良いですか?

もしマイクロソフトWindowsを使っているならば、wglShareLists()機能を使ってください。 もしGLXを使っているならば、glXCreateContext()にシェアパラメータを見てください。

GLUTはディスプレイリスト共有を許しません。 GLUTソースを得て、あなた自身のglutCreateWindow()とglutSetWindow()ファンクションコールを作ることができます。 ディスプレイリスト共有を露出するために、その時ソースを修正できます。 そうする時に、確かめる必要がある 修正されたルーチンは、まだGLUTの残りで働いています。

16.030  ネスト(階層化)されたディスプレイリストは動きますか?呼び出されたリストは呼び出しリストにコピーされるのですか?

No. 同封されたディスプレイリストへの呼び出しだけが親リストにコピーされます。 プログラムが子供リストを削除するか、または交換できるこちら親を呼び、起こされた変化を見てください。

16.040  ディスプレイリストが呼ばれている間、ある特定の機能を動かすことができますか?

ディスプレイリスト呼び出しは原子動作であり、従って、それは中断できません。 例えば、それの一部に電話できず そして行ない何か 、そして、その残りに電話します。 ディスプレイを持っている缶もリストしました 何とかして、リスト内の数ポイントからプログラムを信号で伝える 。

しかし、アプリケーションは1つの大きなモノリシックのディスプレイリストを作成する必要がありません。 逐次呼びかけるためにいくつかのより小さいリストを作成することによって、アプリケーションは自由にglCallList()に呼び出しの間の仕事を実行します。

アプリケーションは多重糸も使うことができます。従って、別のスレッドがディスプレイリストを呼んでいる間、1つのスレッドが1回の仕事を実行できます

16.050  ディスプレイリストの中の多くの機能呼び出しを、他の OpenGL 機能の呼び出しに差し換えることができますか?

OpenGLディスプレイリストは編集可能ではありません。従って、それらでの呼び出し連続を修正できないか、またはどの呼び出しがそれらに埋め込まれるかをわかりさえします

偽り編集可能のディスプレイリストを作成する一方の方法は、階層的なディスプレイリストを作成することです。 (すなわち、呼び出しをglCallList()に含んでいるディスプレイリスト親を作成してください)。 そして、子供ディスプレイリストを交換してディスプレイリストを編集できて、親は参照をリストしました。

16.060  ディスプレイリストからパラメータと呼び出される機能のリストを得ることができますか?

現在、リスト内に含まれているファンクションコールまたはパラメータをprogramaticallyに得るための方法が、それらの呼び出しにありません。 この情報を必要とするアプリケーションは、ディスプレイリストにおいて格納されたデータを追跡しなければなりません。

1つのオプションがOpenGL呼び出し記録ユーティリティを使う必要があります。 これらのユーティリティキャプチャOpenGL呼び出しプログラムは作り、アプリケーションがディスプレイリストに蓄える呼び出しを見ることを可能にします。

16.070 ディスプレイリストを使うようプログラムを書き換えました。けれども少しも速くなりません。なぜですか?

ディスプレイリストから最も高い性能を達成することは、OpenGLインプリメンテーションに非常に依存するけれども、ここには少しのポインタがあります

第一に、アプリケーションのプロセスサイズがそんなに大きくなっていないことを確かめてください。それはメモリー強打を起こします。 ディスプレイリストを使うことにより一般に即時のモードより多いメモリーが取られます。従って、プログラムが、メモリーブロックを打つのに、OpenGLが呼びかけるより多い時間を費やしていることは可能です。

ディスプレイリストは、満たし制限された申込書の性能を改善しません。 より小さいウィンドウに与えてみてください。もし申込書がより速く動くならば、それが満たし制限されることがありそうです。

GL_COMPILE_AND_EXECUTEモードを留守にしてください。 代わりに、GL_COMPILEモードを使ってリストを作成し、そして、glCallList()によってそれを実行してください。

もし場合によっては、国の変化をグループ分けするならば、ディスプレイリストはグループとしてそれらを最適化できるでしょう(すなわち、それは冗長な国変化を削除できます 隣接した行列変化などに連結する )。

他の秘訣のための性能においてセクションを読んでください

16.080   領域を節約するため、ディスプレイリストに保管する前に全ての座標を short に変換しておかなければいけませんか?

No. ほとんどのインプリメンテーションは、とにかく、および通常、データをディスプレイリストの記憶装置のための内部のフォーマットに変換し、そのフォーマットは単精度フロートです。

16.090  ディスプレイリストの中にテクスチャーを置くと速く動きますか?

いくつかのインプリメンテーションにおいて、ディスプレイリストがテクスチャーメモリーのテクスチャーダウンロードと使用を最適化できます。 OpenGL1.0では、テクスチャーマップをディスプレイリストに蓄えることは、テクスチャー性能を最適化する好まれた方法でした。 しかし、それは、多くのインプリメンテーションの増大したメモリー用法を結果として生じました。 多くのベンダは、よりよい解決策、OpenGL1.1において導入されたテクスチャーオブジェクトに結集しました。 もしOpenGL1.1以降においてアプリが動いているならば、テクスチャーオブジェクトは好まれます。

16.100  ディスプレイリストの中に頂点配列を置くと速く動きますか?

それはインプリメンテーションに依存します。 ほとんどのインプリメンテーションにおいて、それは、増大したメモリー使用のため性能を減少できます。 しかし、いくつかのインプリメンテーションがグラフィックスハードウェアのディスプレイリストをキャッシュできます。従って、このキャッシュの利点は特別なメモリー用法を容易にオフセットすることができました。

16.110  コンテキスト間でディスプレイリストを共有しているとき、一方のコンテキストでディスプレイリストを削除してしまった場合、 何が起こりますか?また、完全に削除するためには全てコンテキストにおいて、削除を実行しなければいけませんか?

1つの文脈(削除は部分修正のフォームです)においてディスプレイリストが修正される時には、その部分修正の結果は、すべての共有された文脈で次に入手可能です。 従って、1つの文脈においてディスプレイリストを削除することは、それに、以前にそれが見えたすべての文脈に存在することを止めさせます。

16.120  どのくらいたくさんのディスプレイリストを作ることができますか?

OpenGLスペックに基づく限界がありません。 ディスプレイリストIDがGLuintであり 2 ので32 ディスプレイリスト識別子は入手可能です。 通り過ぎるより実用的な限界は、システムメモリー資源です。

16.130  ディスプレイリストはどのくらいメモリを消費しますか?

このセクションの中で最初の問題を見てください。 それはインプリメンテーションに依存します。

16.140  ディスプレイリストが使っていたメモリ領域が使用後に解放されるかどうかはどうやったら解りますか?

これはインプリメンテーションに依存します。 ディスプレイリストが削除されるとすぐにいくつかのインプリメンテーションがメモリーを解放します。 他は、それが別のディスプレイリストによって必要があったか、または、プロセスが止まるまで、メモリーを解放しません。

16.150  形状の頂点として、頂点配列を利用するにはどのようにしたら良いですか?

頂点配列があなたをインデックスによって頂点とデータのセットにアクセスさせるので、頂点を最適に共有するために、それらがデザインされると信じてさしつかえありません。 実に、頂点配列のために新しいプログラマーは、個々の頂点が3つの面により共有される立方体をしようとすることができます。 点火のための垂直線を追加し、共有された頂点の個々の例がユニークな正常を必要とする時には、これの無益は明らかになります。 垂直線によって立方体をするための唯一の方法は、個々の頂点の複数のコピーを含むことです。

頂点配列は、頂点共有を改善するためにデザインされませんでした。 それらは、できる限り少しのファンクションコールによって動的な幾何学データのブロックを指定するためにプログラマーにそうさせることを意図しました。

頂点を、頂点配列と、使われたプリミティブのタイプのためOpenGL即時モードが必要なのと同じ方法で共有できます。 GL_LINE_STRIP、GL_LINE_LOOP、GL_TRIANGLE_STRIP、およびGL_QUAD_STRIPは、頂点を、それらのコンポーネントラインセグメント、三角形、およびクワタに分けます。 他のプリミティブはしません。 頂点配列を使う時に、使うために選ぶプリミティブのタイプは、頂点を共有するかどうかを決定します。

しかし、共有頂点がインプリメンテーション扶養家族であることに注意してください。 OpenGL指定命令頂点配列行動およびOpenGLインプリメンテーションがスペックに対応するので、長い 頂点配列を分担している頂点を最適化することが自由です。

いくつかのインプリメンテーションがEXT_compiled_vertex_array拡張を特徴とし、それは、インプリメンテーションに、変換された頂点配列データを共有させるために明示的にデザインされます