引擎版本3.5 beta0
看cpp-test 里的ShaderTest.cpp : 161
void ShaderNode::loadShaderVertex(const std::string &vert, const std::string &frag)
{
auto fileUtiles = FileUtils::getInstance();
// frag
auto fragmentFilePath = fileUtiles->fullPathForFilename(frag);
auto fragSource = fileUtiles->getStringFromFile(fragmentFilePath);
// vert
std::string vertSource;
if (vert.empty()) {
vertSource = ccPositionTextureColor_vert;
} else {
std::string vertexFilePath = fileUtiles->fullPathForFilename(vert);
vertSource = fileUtiles->getStringFromFile(vertexFilePath);
}
auto glprogram = GLProgram::createWithByteArrays(vertSource.c_str(), fragSource.c_str());
auto glprogramstate = GLProgramState::getOrCreateWithGLProgram(glprogram);
setGLProgramState(glprogramstate);
}
创建一个GLProgram,再去getOrCreate一个GLProgramState
再看GLProgramState::getOrCreateWithGLProgram()
GLProgramState* GLProgramState::getOrCreateWithGLProgram(GLProgram *glprogram)
{
GLProgramState* ret = GLProgramStateCache::getInstance()->getGLProgramState(glprogram);
return ret;
}
再看GLProgramStateCache::getGLProgramState(GLProgram* glprogram)
GLProgramState* GLProgramStateCache::getGLProgramState(GLProgram* glprogram)
{
const auto& itr = _glProgramStates.find(glprogram);
if (itr != _glProgramStates.end())
{
return itr->second;
}
auto ret = new (std::nothrow) GLProgramState;
if(ret && ret->init(glprogram)) {
_glProgramStates.insert(glprogram, ret);
ret->release();
return ret;
}
CC_SAFE_RELEASE(ret);
return ret;
}
这样看下来,每创建一个新的ShaderNode都会在GLProgramStateCache里面保留一份GLProgramState的cache,没有途径可以单独删除
然后由于GLProgramState在init的时候对GLProgram做了retain,所以GLProgram也删除不掉
这样每新建一个ShaderNode,内存就在涨啊涨
回到标题的问题上来,GLProgramStateCache::getGLProgramState(GLProgram* glprogram) 该怎么用?
如果我要创建很多带shader的sprite,貌似应该是创建好一个GLProgramState然后set到每个sprite,这时也用不到通过GLProgram去cache里查找一个GLProgramState吧?
如果我要创建很多带shader的sprite,每个sprite的shader的uniform参数不一样……要么就是大家公用一个GLProgramState每次draw之前重新设置uniform,要么就是大家用各自的GLProgramState,后者的话,按上述的情况看,这个cache在不停的增大……