12

私は OpenGL4.X を使用しています。最近、このApple OpenGLES2 doc を読みました。ここでは、インターリーブされた属性配列を使用すると、IOS モバイル デバイスでのパフォーマンスが向上し、(属性のブロックを使用する代わりに) 推奨される方法であると述べられています。

私が何を意味するのか理解できなかった人のために、ここに例を示します。

単一の属性配列内の属性のブロック:

 float vertices[]{
 //Triangle vertices:

  v0x , v0y , v0z ,
  v1x , v1y , v1z ,
  v2x , v2y , v2z ,

  //Triangle UVs:

  uv0s , uv0t ,
  uv1s , uv1t ,
  uv2s , uv2t ,

  //Triangle Normals:
  n0x , n0y , n0z ,
  n1x , n1y , n1z ,
  n2x , n2y , n2z 

}

インターリーブされた属性配列:

 float vertices[]{


  v0x , v0y , v0z ,
  uv0s , uv0t ,          ////vertex 1 attributes
  n0x , n0y , n0z ,

  v1x , v1y , v1z ,
  uv1s , uv1t ,         ///vertex 2 attributes
  n1x , n1y , n1z ,

  v2x , v2y , v2z ,
  uv2s , uv2t ,         ///vertex 3 attributes
  n2x , n2y , n2z 

}

だから私の質問は:デスクトップGPUで実行されているOpenGLにも当てはまりますか? はいの場合、パフォーマンスの向上は理論的にどのくらい大きくなりますか?

4

4 に答える 4

8

デスクトップ GPU で実行されている OpenGL にも当てはまりますか?

Vertex 仕様の wiki ページから:

原則として、可能な限りインターリーブされた属性を使用する必要があります。明らかに、特定の属性を変更する必要があり、他の属性を変更する必要がない場合は、変更する属性と変更しない属性を交互に配置することはお勧めできません。


理論的にはパフォーマンスの向上はどのくらいですか?

はっきりとは言えませんが、大幅な改善は期待できません。唯一の確実な方法は、測定することです。

于 2013-02-14T12:45:20.577 に答える
6

最適化によってパフォーマンスが向上するためには、まずパフォーマンスのボトルネックとなっているものを最適化する必要があります。それが現在ボトルネックでない限り、それについて何かをしても必ずしもパフォーマンスが向上するとは限りません。

パフォーマンスの向上は、最初に頂点転送パフォーマンス (つまり、これが最適化するもの) にボトルネックがあるかどうかに依存するため、質問に答える方法はありません。頂点シェーダー、フラグメント シェーダー、および CPU の問題がボトルネックにならないようにグラフィックス カードを実際に強く押していない限り、これは問題になりません。

また、ハードウェアが異なれば応答も異なるため、どれだけのゲインが得られるかを知る方法はありません。ボトルネックの厳しさに基づいて、状況が異なれば対応も異なります。

属性をインターリーブするだけです。費用はかからず、最小限の時間や労力で済み、パフォーマンスの点で重要な価値がある場合があります。

于 2013-02-14T17:50:30.107 に答える
4

インターリーブされた属性配列の利点は、メモリの局所性です。これは、必要なすべての頂点データが互いに隣り合って配置され、複数のバッファーに配置されたデータと比較してより効率的にフェッチできることを意味します。

多くの属性を持つ多数の頂点を持つと、パフォーマンスの違いが明らかになる場合があります。bigmanyの値は、プロファイリングによって確立する必要があります。

于 2013-02-14T12:39:04.933 に答える
1

私は間違っているかもしれませんが、三角形の頂点などをレンダリングするときに GPU がデータ (頂点、法線、および UV マップ) を必要とし、頂点、法線、および UV マップのバッファーがオブジェクト (たとえば、大きな球体 (glsphere ではなく glvertex でレンダリング)...

GPU は、小さな四角形をレンダリングしている間、頂点、法線、および uvmap を行ったり来たりしなければなりません。これは、それらのすべてを GPU 内のバッファーに格納することができないためです。

バスを介した通信は、通常、プロセッサの速度よりも遅くなります。

さて、この場合、インターリーブされた配列は大きな利点であり、バス通信を減らします。GPU はインターリーブされた配列を簡単に処理でき、レンダリングされる頂点の特定のセットにすべてのデータを使用できます。

于 2016-05-12T18:16:24.860 に答える