繁体   English   中英

纹理映射消耗物理内存

[英]Texture mapping consuming physical memory

我的纹理映射存在问题,当我执行代码时,它平稳运行了5-8秒,然后帧速率急剧下降,当我监视任务管理器时,似乎该程序消耗了几乎95%的物理内存,任何人知道如何解决这个问题? 我正在使用Visual Studio C ++ 2010

这是代码

GLuint LoadtankTexture(const char * pic, int width, int height){
        GLuint tankTexture;
        BYTE * data;
        FILE * picfile;
        picfile = fopen(pic, "rb");
        data = (BYTE *)malloc(width * height * 3);

        fread(data, width * height, 3, picfile);
        fclose(picfile);

        glGenTextures(1, &tankTexture);
        glBindTexture(GL_TEXTURE_2D,  tankTexture);

        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);

        glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
        glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
        glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
        glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

        free(data);
        return tankTexture;}

这是另一个代码

void Tank::drawSelf(){
glPushMatrix();
    glTranslatef(this->posX, 0.0f, this->posZ);
    glRotatef(this->rotation, 0.0f, 1.0f, 0.0f);
    static float w, h, d, d2;
    w = this->width; //0.5
    h = this->height; //0.5
    d = this->depth;    //0.7
    d2 = this->depth / 1.4f; //0.5

    glColor3f(0.0f,1.0f, 0.3f);
    glEnable(GL_TEXTURE_2D);

    GLuint tankTex;
    tankTex = LoadtankTexture("tankbmp.bmp", 500, 500);
    glBindTexture(GL_TEXTURE_2D, tankTex);
    glBegin(GL_QUADS);
    //Front
    glNormal3f(0.0f, h, -d);
    glTexCoord3f(-w, h, -d); glVertex3f(-w, h, -d);
    glTexCoord3f(w, h, -d); glVertex3f(w, h, -d);
    glTexCoord3f(w, 0.0, -d2); glVertex3f(w, 0.0, -d2);
    glTexCoord3f(-w, 0.0, -d2); glVertex3f(-w, 0.0, -d2);

    //Back
    glNormal3f(0.0f, -0.5f, 0.7f);
    glTexCoord3f(-w, h, d2); glVertex3f(-w, h, d2);
    glTexCoord3f(w, h, d2); glVertex3f(w, h, d2);
    glTexCoord3f(w, 0.0, d); glVertex3f(w, 0.0, d);
    glTexCoord3f(-w, 0.0, d); glVertex3f(-w, 0.0, d);

    //Left
    glNormal3f(-1.0f, 0.0f, 0.0f);
    glTexCoord3f(-w, h, -d); glVertex3f(-w, h, -d);
    glTexCoord3f(-w, 0.0, -d2); glVertex3f(-w, 0.0, -d2);
    glTexCoord3f(-w, 0.0, d); glVertex3f(-w, 0.0, d);
    glTexCoord3f(-w, h, d2); glVertex3f(-w, h, d2);

    //Right
    glNormal3f(1.0f, 0.0f, 0.0f);
    glTexCoord3f(w, h, -d); glVertex3f(w, h, -d);
    glTexCoord3f(w, 0.0, -d2); glVertex3f(w, 0.0, -d2);
    glTexCoord3f(w, 0.0, d); glVertex3f(w, 0.0, d);
    glTexCoord3f(w, h, d2); glVertex3f(w, h, d2);

    //Bottom
    glNormal3f(0.0f, -1.0f, 0.0f);
    glTexCoord3f(-w, 0.0, -d2); glVertex3f(-w, 0.0, -d2);
    glTexCoord3f(-w, 0.0, d); glVertex3f(-w, 0.0, d);
    glTexCoord3f(w, 0.0, d); glVertex3f(w, 0.0, d);
    glTexCoord3f(w, 0.0, -d2); glVertex3f(w, 0.0, -d2);

    //Top
    glNormal3f(0.0f, 1.0f, 0.0f);
    glTexCoord3f(-w, h, -d); glVertex3f(-w, h, -d);
    glTexCoord3f(-w, h, d2); glVertex3f(-w, h, d2);
    glTexCoord3f(w, h, d2); glVertex3f(w, h, d2);
    glTexCoord3f(w, h, -d); glVertex3f(w, h, -d);
    glEnd();
    glDisable(GL_TEXTURE_2D);

    glPushMatrix();
        glTranslatef(0.0f, h*1.3f, 0.0f);
        glRotatef(this->turretRotation, 0.0f, 1.0f, 0.0f);
        glTranslatef(0.0f, 0.0f, this->recoilDistance*0.5);
        makeRectangularPrism(w*(3.0f/5.0f), 0.0f, -d/2, -w*(3.0f/5.0f), h/2, d/2);
        glTranslatef(0.0f, 0.025f, -0.6f);
        glTranslatef(0.0f, 0.0f, -0.2f + this->recoilDistance*0.8f);
        makeRectangularPrism(0.05f, -0.05f, -1.0f, -0.05f, 0.05f, 0.0f);
    glPopMatrix();
    if(this->hasShieldLeft()){
        glColor4f(0.1f, 0.1f, 1.0f, this->shieldOpacity);
        glutSolidSphere(this->width*3, 20, 20);
        glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
    }   
glPopMatrix();  }

您每次调用drawSelf()时都在调用LoadtankTexture()。
LoadtankTexture()在被调用时会创建一个新纹理,并用纹理数据填充它。

定期调用LoadtankTexture()会在内存中创建纹理的许多副本。

您只需要创建一次纹理(除非您主动删除它,否则您将遭受上下文丢失),因此应该将对LoadtankTexture的调用从drawSelf移至初始化代码,并将返回的int保留在某个位置(例如,将tankTex设置为成员变量)。

您应该像现在一样继续从drawSelf调用glEnable(GL_TEXTURE_2D)和glBindTexture(GL_TEXTURE_2D,tankTex)。

如果这不能解决问题,则您的代码中可能还有另一个内存韭菜。

几秒钟后的速度下降几乎可以肯定是由于计算机内存不足而导致操作系统开始交换。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM