« 自作ゲーム#02 - 巨人戦機 GIANTS - | トップページ | ファイル#06 - Etoile(エトワル)- »

OpenGL テクスチャレンダリングが遅い

 今制作中のゲームは,昔のゲームと同じ2Dタイプなのだが,実際にポリゴンにテクスチャを貼り合わせたものをタイルのように背景に敷き詰めて表示させてみるともの凄く遅い。
 敵や弾を200個くらい出した上で,フィールドに,16ドット正方形を256個(256*256の平面),毎フレーム並べるとまぁ,最大80fpsくらいまで落ちてしまった。
(テクスチャオブジェクトが500くらい?)
 仕様的には,背景には16ドット正方形を20*24個の2面くらい表示させる(2重スクロールなので)つもりなので,これでは自分の環境(iBookG4/1G)以下だとかなりやばいことになってしまいそうだ。

 ということで何が足を引っ張っているかを調べてみた。

↓テクスチャスプライト表示ルーチン
void kgu_GLPutTextureByRatioWithColor( double x, double y, double z, double ratioX, double ratioY, double rot, const GLdouble* colorv, GLuint texpatt )
{
GLint wdot, hdot;
double borderX, borderY;

glBindTexture( GL_TEXTURE_2D, texpatt );
glGetTexLevelParameteriv( GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &wdot );
glGetTexLevelParameteriv( GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &hdot );
glPushMatrix();
glEnable(GL_BLEND);
glTranslated( x, y, z );
glRotated( rot, 0, 0, 1 );
glScaled( ratioX*wdot, ratioY*hdot, 1 );
glEnable(GL_TEXTURE_2D);
glColor4d( *(colorv+0), *(colorv+1), *(colorv+2), *(colorv+3) );

glBegin(GL_QUADS);
{
glTexCoord2d(0+borderX, 0); glVertex2d( -0.005, -0.005 );
glTexCoord2d(1, 0); glVertex2d( 0.005, -0.005 );
glTexCoord2d(1, 1); glVertex2d( 0.005, 0.005 );
glTexCoord2d(0+borderX, 1); glVertex2d( -0.005, 0.005 );
}
glEnd();
glDisable(GL_TEXTURE_2D);
glDisable(GL_BLEND);
glPopMatrix();
}

 まず,glBegin以下をコピペして,1度に3倍テクスチャを表示するようにしたところ,ほとんど速度に影響がなかったのはとても意外。
 で,Push・Pop等のスタック処理あたりが,オブジェクトが増えると指数的に大きくなりそうだから,怪しいと踏んで,「glPushMatrix();glPopMatrix();」を間にたくさん挟んでみたところ効果はあまりなし。
 尤もこれが使えないとなると,回転とか拡大縮小が大変なことになって,GLの利便性そのものが大きく失われてしまう。ただ,glRotatedは多少効果があるので,rotが0ならこの演算は飛ばすのがよいかも。

 そうしていろいろ試して見ると,一番効果が大きかったのが,glBindTextureだということが分かる。
 このプログラムでは,キャラ絵が列挙された1枚のビットマップから,16*16や,32*32ドットにテクスチャを切り出してglTexImage2Dで予めガバッと登録しておき,随時任意のテクスチャをバインドして表示ということをやっている。
 試しに,glBindTextureを封じ,テクスチャ替えずに(同じキャラが表示され続ける)回したところ,150fpsくらいまで上がった。

 ということで,この点を解決するにはテクスチャは切り出さずに,キャラが列挙されたでかい1枚テクスチャを登録し,任意にglTexCoord2dで表示したいキャラの枠を指定するのがよさそうです。しかもテクスチャ登録のオーバーヘッドも小さくなるというおまけ付き。

 実はこの問題は,4,5年前 最初にGLのゲームを作ったときにも気になったのだが,それほどテクスチャをたくさん表示しないこともあり,放置していた。今回はトレンドに対しても対応できるようもっとたくさんテクスチャスプライトを表示したいのでもう少し考えてみようと。

 機会があればglTexSubImage2Dによるテクスチャの置き換えを使った高速背景表示の手法も紹介します。

※この結果は絶対的なアドバンテージを明らかにしているのではなく,動かす環境によって効果は結構変わりそうだから参考までに。

|

« 自作ゲーム#02 - 巨人戦機 GIANTS - | トップページ | ファイル#06 - Etoile(エトワル)- »

プログラム」カテゴリの記事

自作ゲーム」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/214807/43586632

この記事へのトラックバック一覧です: OpenGL テクスチャレンダリングが遅い:

« 自作ゲーム#02 - 巨人戦機 GIANTS - | トップページ | ファイル#06 - Etoile(エトワル)- »