2011-08-11 11 views
2

解決方法がわからない問題があります。 私は3D OpenGLとMVC++ 2010のゲームで複数のテクスチャを取得する方法を知っていますが、その方法は非常に遅いです。より多くのテクスチャをロードするほど、ゲームはより遅くなります。私がこのことに固執してから2週間が経ちました。私は多くのサイトを検索しましたが、どれも私を助けませんでした。glauxなしで複数のテクスチャを追加するにはどうすればよいですか?

私は間違いを与え続けているし、メモリリークがあると言われているので、膠色が欲しくない。 これは私が.RAWテクスチャをロードする方法です:

GLuint texture; //ID to bind with

GLuint LoadTexture(const char *filename, int imW, int imH){ 
    unsigned char*data; 
    FILE*file; 

    file=fopen(filename,"rb"); 
    if(file==NULL)return 0; 
    data=(unsigned char*)malloc(imW*imH*3); 
    fread(data,imW*imH*3,1,file); 
    fclose(file); 

    glGenTextures(1,&texture); 
    glBindTexture(GL_TEXTURE_2D,texture); 
    glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE); 
    glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR); 
    glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); 
    glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT); 
    glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT); 
    glTexParameterf(GL_TEXTURE_2D,0x8191,1); //0x8191 means GL_GENERATE_MIPMAP 
    glTexImage2D(GL_TEXTURE_2D,0,3,imW,imH,0,GL_RGB,GL_UNSIGNED_BYTE,data); 
    free(data); 
    return texture; 
    } 

私はOpenGLの2を持っていますが、私が使用し、 "glTexParameterf(GL_TEXTURE_2D、0x8191,1);" "gluBuild2DMipmaps"がそれより遅いのでミップマップを構築する。

void model_room(float x, float y, float x2, float y2, float z, float z2){ 
LoadTexture("tex_floor.raw",512,512); 
model_floor(x,y,x2,y2,z,7,7); 
glDeleteTextures(1,&texture); 

LoadTexture("tex_ceiling.raw",512,512); 
model_floor(x,y,x2,y2,z2,4,4); 
glDeleteTextures(1,&texture); 

LoadTexture("tex_wall.raw",512,512); 
model_wall(x,y,x,y2,z,z2,1,1); 
glDeleteTextures(1,&texture); 

LoadTexture("tex_tiles.raw",512,512); 
model_wall(x,y2,x2,y2,z,z2,1,1); 
glDeleteTextures(1,&texture); 

LoadTexture("tex_diamondtiles.raw",512,512); 
model_wall(x2,y2,x2,y,z,z2,1,1); 
glDeleteTextures(1,&texture); 

LoadTexture("tex_castlepoint.raw",512,512); 
model_wall(x2,y,x,y,z,z2,5,3); 
glDeleteTextures(1,&texture); 
} 

ここで、コードはテクスチャを読み込み、フレームごとに削除します。それはいい考えではないかもしれませんが、今は大丈夫です。 「model_wall」と「model_floor」については、これはコードです:

void model_floor(float x, float y, float x2, float y2, float z, float tc1, float tc2){ 
glBegin(GL_QUADS); 
    glTexCoord2f(0,  0);  glVertex3f(x, y, z); 
    glTexCoord2f(tc1, 0);  glVertex3f(x, y2, z); 
    glTexCoord2f(tc1, tc2); glVertex3f(x2, y2, z); 
    glTexCoord2f(0,  tc2); glVertex3f(x2, y, z); 
glEnd(); 
    } 

    void model_wall(float x, float y, float x2, float y2, float z1, float z2, float tch, float tcv){ 
glBegin(GL_QUADS); 
    glTexCoord2f(0,  0);  glVertex3f(x, y, z2); 
    glTexCoord2f(tch, 0);  glVertex3f(x2, y2, z2); 
    glTexCoord2f(tch, tcv); glVertex3f(x2, y2, z1); 
    glTexCoord2f(0,  tcv); glVertex3f(x, y, z1); 
glEnd(); 
    } 

私はちょうど良い方法は、ゲームを落とすことなく、テクスチャをロードするだけで推奨されRawファイル以外のものをロードするために、それは重要ではありません。私はWin Baseのプログラマーではないので、これらのタイプのコードについていくつかの説明が必要な場合があります。どんな助けもありがとう。前もって感謝します!

+0

ここで新しくなったので、同意と投票の機能についてご説明ください。 –

答えて

3

フレームごとにすべてのテクスチャを読み込んで破棄するのは良い考えではないでしょうか? 間違いなく、は良いアイデアではなく、確かにあなたのパフォーマンス低下の原因!それはテクスチャオブジェクトのためのものです(あなたが得たIDはglGenTexturesです)。これらはビデオメモリのテクスチャへのハンドルです。したがって、最初にすべてのテクスチャをロードしてから、描画前に(model_wallコールの前に)必要なテクスチャをバインドするだけです(glBindTextureを使用)。そして、プログラムの終わりに、glDeleteTexturesを使ってそれらを破壊します。

グロウクスに言及すると、私はかなり古い学習リソースを使用していると思いますが、そこからこのプラクティスを取得すれば、より良いチュートリアルや本を探すべきでしょう。

2

フレームごとにテクスチャを読み込むのはひどいアイデアです。おそらくゲームが遅くなる理由です。それらを一度ロードしてから使用するとアクティブにしてください。

+0

だから、IDを使ってそれらを生成してIDを使用する必要がありますか? – CppOgl

+0

@CppOgl:そうです。 –

関連する問題