纹理映射消耗物理内存
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 保存在某个地方(例如 make tankTex成员变量).
您应该像现在一样继续从 drawSelf 调用 glEnable(GL_TEXTURE_2D) 和 glBindTexture(GL_TEXTURE_2D, tankTex)。
如果这不能解决问题,那么您的代码中的其他地方可能有另一个内存韭菜。
几秒钟后速度变慢几乎可以肯定是由于计算机 运行 物理内存不足,迫使 OS 开始交换。
我的纹理映射有问题,当我执行代码时,它 运行 平稳地持续了 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 保存在某个地方(例如 make tankTex成员变量).
您应该像现在一样继续从 drawSelf 调用 glEnable(GL_TEXTURE_2D) 和 glBindTexture(GL_TEXTURE_2D, tankTex)。
如果这不能解决问题,那么您的代码中的其他地方可能有另一个内存韭菜。
几秒钟后速度变慢几乎可以肯定是由于计算机 运行 物理内存不足,迫使 OS 开始交换。