奇妙な問題が
あります。15x15要素のゲームフロアを出力する必要があります。
これまで、ゲームループで関数「printFloor()」を呼び出していました。
この関数は、225の要素すべてをステップスルーし、それらの値に応じて、テクスチャファイルの異なる部分を表示します。そのため、CPUはすべてのループサイクルで同じ225テクスチャをレンダリングする必要がありました。ゲームループは各サイクルで約16〜32ミリ秒必要だったので、この出力をディスプレイリストに入れました。
if(!gamefloorPrepared) //no Display list created -> this is the first time the floor nees to
//be printed
{ gamefloor = glGenLists(1);
glNewList(gamefloor,GL_COMPILE);
for(int y=0;y<size.y;y++)
{ for(int x=0;x<size.x;x++)
{ printFloorElement(spielfeld[y][x],{x,y}); //see below
}
}
glEndList();
gamefloorPrepared=1;
}else
{ glCallList(gamefloor);
}
関数printFloorElementは、位置を計算し、グラフィックモードを「switchGraphicMode(TEXTURES);」に変更し、テクスチャをバインドして、テクスチャを描画します。
glBegin(GL_QUADS);
glTexCoord2f(spriteSize.x* spritePos.x +halfTexelSize.x,spriteSize.y*(spritePos.y+1)-halfTexelSize.y); glVertex2f(display.a.x,display.a.y);
glTexCoord2f(spriteSize.x* spritePos.x +halfTexelSize.x,spriteSize.y* spritePos.y +halfTexelSize.y); glVertex2f(display.a.x,display.b.y);
glTexCoord2f(spriteSize.x*(spritePos.x+1)-halfTexelSize.x,spriteSize.y* spritePos.y +halfTexelSize.y); glVertex2f(display.b.x,display.b.y);
glTexCoord2f(spriteSize.x*(spritePos.x+1)-halfTexelSize.x,spriteSize.y*(spritePos.y+1)-halfTexelSize.y); glVertex2f(display.b.x,display.a.y);
glEnd();
問題:1つのゲームループサイクルに60〜80ミリ秒かかるため、かなり遅くなります。ディスプレイリストは一度だけ生成されます、私はすでにそれをチェックしました。
「switchGraphicMode()」-関数:
void switchGraphicMode(GRAPHICMODES target)//can be "TEXTURES" or "DRAWING"
{ if(target != graphicMode)//"gaphicMode" = global Variable which shows if GL_TEXTURE_2D is currently enabled
{ if(target==DRAWING)
{ glDisable(GL_TEXTURE_2D);
graphicMode=DRAWING;
}else
{ glEnable(GL_TEXTURE_2D);
graphicMode=TEXTURES;
}
}
}
誰もが理由を知っていますか?