0

私はOpenGL用のVBOに情報を保存するための最良の方法を決定しようとしてきました。多次元配列を使用するとパフォーマンスが低下するため、行列が1次元配列としてどのように格納されるかについて読んでいます。

疑問に思っていたのですが、これはVBOに情報を保存することにも及ぶのでしょうか。一次元または多次元配列のVBO内に頂点情報を格納する方が理にかなっていますか?

何を格納しているかによって異なるという答えをたくさん受け取る前に、多次元配列(マップ、グリッドなど)で従来考えられていたものについて具体的に話します。

多次元配列がある場合は、それを使用してどのような種類のパフォーマンスヒットを確認しますか?

4

2 に答える 2

2

意味がないので、質問は無効です。バッファオブジェクトは、OpenGLによって保存および管理されるメモリのブロックです。これは、C#配列またはC#多次元配列ではありません。これは、データを転送するメモリのブロックです。

バッファオブジェクトに入れる頂点データは、許可されているものに準拠している必要がありglVertexAttribPointerます。C#でそれをどのように達成するかは、あなたとあなたが使用するAPI次第です。

于 2012-07-06T22:35:06.210 に答える
0

多次元配列を使用するとパフォーマンスが低下するため、は1次元配列として格納されます。

あなたの混乱は、多次元配列とそれらをどのように表現できるかに関する用語の違いに起因していると思います。

Cでは、配列はポインタの間接参照を介してアクセスされます。

int arr[10];

arr[5] <--> *(arr+5)

実際、インデックス演算子はo[i]完全に同等であり、同じ式を生成するため、*(o+i)実際に書くこともできます。i[o]したがって、インデックス演算子はポインタ演算と逆参照を行います。これは、Cマルチディムアレイにとって何を意味しますか。

int marr[10][10];

int (*row)[10] = marr[5] <--> *(marr + 5);

mrow[5] = *(mrow + 5) <--> marr[5][5];

そして、これを好きなだけ次元に拡張することができます。したがって、C言語では、多次元配列は複数のポインター逆参照を通過します。これは、データがメモリ内で連続しておらず、実際には行ごとにサイズが異なる可能性があることを意味する場合もあります。そしてそれが彼らが非効率的である理由です。Cはこれを実行し、列ポインターと行の動的割り当てを可能にします。

ただし、多次元配列を格納するもう1つの方法は、フラットストレージモデルです。つまり、すべての要素を1つの値の文字列に連結するだけです。そして、あなたが知っている寸法を導入することによって、このストリングをどこでカットして再配置するか。

int fmarr[10*20*30];

int at1_2_3 = fmarr[1*30*20 + 2*20 + 3];

ご覧のとおり、すべてのサイズは静的であり、データは連続しています。ポインターの逆参照はありません。これにより、データの操作がはるかに簡単になり、さらに重要なことに、操作のベクトル化が可能になります。これにより、パフォーマンスが大幅に向上します。

于 2012-07-07T10:22:37.803 に答える