cocos2dx-3.6或3.8.1版本,给3D模型添加自定义shader,内存泄露!!

如题,在3.6和3.8.1版本都试过 问题一样

auto glprogram = GLProgram::createWithFilenames(“vert.vsh”, “frag.fsh”);
auto glprogramstate = GLProgramState::getOrCreateWithGLProgram(glprogram);
_sprite->setGLProgramState(glprogramstate);

auto textrue1 = Director::getInstance()->getTextureCache()->addImage("***.jpg");
glprogramstate->setUniformTexture(“u_texture1”, textrue1);

auto textrue2 = Director::getInstance()->getTextureCache()->addImage("***.png");
glprogramstate->setUniformTexture(“u_texture2”, textrue2);

Texture2D::TexParams tRepeatParams;
tRepeatParams.magFilter = GL_LINEAR;
tRepeatParams.minFilter = GL_LINEAR;
tRepeatParams.wrapS = GL_REPEAT;
tRepeatParams.wrapT = GL_REPEAT;
textrue2->setTexParameters(tRepeatParams);

long offset = 0;
auto mesh = _sprite->getMesh();
auto attributeCount = mesh->getMeshVertexAttribCount();
for (auto k = 0; k < attributeCount; k++) {
auto meshattribute = mesh->getMeshVertexAttribute(k);
int vertexSizeInBytes = mesh->getVertexSizeInBytes();
glprogramstate->setVertexAttribPointer(s_attributeNames,
meshattribute.size,
meshattribute.type,
GL_FALSE,
vertexSizeInBytes,
(GLvoid*)offset);
offset += meshattribute.attribSizeBytes;
}

如上代码中_sprite是一个3D模型,此段代码就是给模型添加自定义shader,每新建一次这个shader内存就涨一次,模型被销毁之后内存依然没有消减,反复创建模型并给赋上shader,过会销毁模型。。。如此反复。。。
内存会一直持续上涨。
如果不添加shader,内存不会变化。。。

谁来解决下啊,困扰已久

好吧 没人解决只有自己动手解决了 无数次的断点调试发现问题所在
原来是GLProgramCache和GLProgramStateCache的锅

使用上面代码的方式创建GLProgram和GLProgramState都会分别被缓存下来,新建一次缓存一次,不断累加,导致内存不断上涨。
现改为如下方式,可解决内存问题:
auto glprogram = GLProgramCache::getInstance()->getGLProgram(“test”);
if (! glprogram){
glprogram = GLProgram::createWithFilenames(“vert.vsh”, “vert.fsh”);
GLProgramCache::getInstance()->addGLProgram(glprogram, “test”);
}
auto glprogramstate = GLProgramState::create(glprogram);
_sprite->setGLProgramState(glprogramstate);

注意:

  1. 创建GLProgram需要自己管理缓存问题,先从缓存查找,有就不用新建,这个GLProgram是可以共用的,意思就是所有模型都可以使用同一个GLProgram。
  2. GLProgramState千万不要用getOrCreateWithGLProgram的方式创建,因为这个接口会新建,而且会缓存下来,也是导致内存上涨的罪魁祸首,要换成GLProgramState::create()方式。

真心感谢,我是参考demo写的,结果一跟进果然内存泄漏了,幸好看到了,解决了一个大问题啊,还有偶尔重后台切换回来,shader会失效,rendertexture会变成黑白块,楼主有解决方法吗

自定义shader在后台切换回来时,需要特殊处理下。需要重新设置一下shader,就是把你初始化shader那段代码重新调用一次。某些安卓机和win端都会有这个问题。