描画の高速化2

halo_w22005-04-11

昨日の続き。頂点配列をOpenGLに渡すときにはglVertexPointer()、glNormalPointer()、などで頂点や法線のデータを個別の配列で渡してやる方法と、glInterleaveArrays()で指定のデータ構造の配列を渡してやる方法がある。

// 個別に配列を指定する場合
glVertexPointer(3, GL_FLOAT, 0, &vertex_array[0]);
glNormalPointer(GL_FLOAT, 0, &normal_array[0] );
glTexCoordPointer(2, GL_FLOAT, 0, &texCoord_array[0]);
	
glDrawArrays(GL_TRIANGLES, 0, num_vertices);
// glInterleavedArrays()の場合
struct Vertex {
  float   texCoord[2];
  float   normal[3];
  float   position[3];
};
...
vector<Vertex>  interleaved_array;
...
glInterleavedArrays(GL_T2F_N3F_V3F, 0, &interleaved_array[0]);
glDrawArrays(GL_TRIANGLES, 0, interleaved_array.size());

というわけで早速速度チェック。独立した3角ポリで1万ポリゴンのモデルを20個表示させてFPSを測定してみた。

  1. glInterleavedArrays()平均25FPS。
  2. 個別に配列を渡す 平均23FPS。
  3. forループでglVertex3f()(w 平均12FPS。

という結果に。glInterleavedArraysがちょっとだけ速いようだった。キャッシュのヒット率の関係とかだろうか。
なにげに頂点配列って頂点、法線、テクスチャ座標をセットで同じ数だけ渡してやらないといかんのかー*1。頂点や法線は共有できる物も多いので、メモリの無駄遣いっぽくて気分が悪い。1GBのメモリが1万円以下で買えるような時代に、そんな些細なことを気にするのはヤボなんだろうか。つくづく貧乏根性が染み付いてることを実感されられた。
1万ポリゴンのモデルを読み込んだら、最初フリーズしたのかと思うほど時間がかかった。どうやら法線の生成が遅い模様。隣接する面を検索する処理が、総当りで検索しているため遅いらしい。法泉の改良は後回しでいいや。

*1:実はインデックスでの指定もできるらしい。いい寡言なこと書いてしまった