1.诱因
近期,项目接入了Bugly, 上报了一些平常测试不出来,或者很难重现的bug,这类bug非常难排查。原因有二,第一,问题无法重现,第二,修改了无法立即验证结果。有一个问题困恼了我很久,就是一直报这块的代码出错。(dispatchEvent报错)
void Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit(JNIEnv* env, jobject thiz, jint w, jint h)
{
auto director = cocos2d::Director::getInstance();
auto glview = director->getOpenGLView();
if (!glview)
{
glview = cocos2d::GLViewImpl::create("Android app");
glview->setFrameSize(w, h);
director->setOpenGLView(glview);
//cocos\_android\_app\_init(env, thiz);
cocos2d::Application::getInstance()->run();
}
else
{
cocos2d::GL::invalidateStateCache();
cocos2d::GLProgramCache::getInstance()->reloadDefaultGLPrograms();
cocos2d::DrawPrimitives::init();
cocos2d::VolatileTextureMgr::reloadAllTextures();
cocos2d::EventCustom recreatedEvent(EVENT\_RENDERER\_RECREATED);
director->getEventDispatcher()->dispatchEvent(&recreatedEvent);
director->setGLDefaultValues();
}
}
2.分析问题
这个一看就是为了防止安卓后台返回资源重建,就去查找所有有做资源重建的类,这一看就找到了以下代码。
bool DrawNode::init()
{
_blendFunc = BlendFunc::ALPHA_PREMULTIPLIED;
setGLProgramState(GLProgramState::getOrCreateWithGLProgramName(GLProgram::SHADER\_NAME\_POSITION\_LENGTH\_TEXTURE\_COLOR));
ensureCapacity(512);
ensureCapacityGLPoint(64);
ensureCapacityGLLine(256);
if (Configuration::getInstance()->supportsShareableVAO())
{
glGenVertexArrays(1, &\_vao);
GL::bindVAO(\_vao);
}
glGenBuffers(1, &\_vbo);
glBindBuffer(GL\_ARRAY\_BUFFER, \_vbo);
glBufferData(GL\_ARRAY\_BUFFER, sizeof(V2F\_C4B\_T2F)\* \_bufferCapacity, \_buffer, GL\_STREAM\_DRAW);
// vertex
glEnableVertexAttribArray(GLProgram::VERTEX\_ATTRIB\_POSITION);
glVertexAttribPointer(GLProgram::VERTEX\_ATTRIB\_POSITION, 2, GL\_FLOAT, GL\_FALSE, sizeof(V2F\_C4B\_T2F), (GLvoid \*)offsetof(V2F\_C4B\_T2F, vertices));
// color
glEnableVertexAttribArray(GLProgram::VERTEX\_ATTRIB\_COLOR);
glVertexAttribPointer(GLProgram::VERTEX\_ATTRIB\_COLOR, 4, GL\_UNSIGNED\_BYTE, GL\_TRUE, sizeof(V2F\_C4B\_T2F), (GLvoid \*)offsetof(V2F\_C4B\_T2F, colors));
// texcood
glEnableVertexAttribArray(GLProgram::VERTEX\_ATTRIB\_TEX\_COORD);
glVertexAttribPointer(GLProgram::VERTEX\_ATTRIB\_TEX\_COORD, 2, GL\_FLOAT, GL\_FALSE, sizeof(V2F\_C4B\_T2F), (GLvoid \*)offsetof(V2F\_C4B\_T2F, texCoords));
if (Configuration::getInstance()->supportsShareableVAO())
{
glGenVertexArrays(1, &\_vaoGLLine);
GL::bindVAO(\_vaoGLLine);
}
glGenBuffers(1, &\_vboGLLine);
glBindBuffer(GL\_ARRAY\_BUFFER, \_vboGLLine);
glBufferData(GL\_ARRAY\_BUFFER, sizeof(V2F\_C4B\_T2F)\*\_bufferCapacityGLLine, \_bufferGLLine, GL\_STREAM\_DRAW);
// vertex
glEnableVertexAttribArray(GLProgram::VERTEX\_ATTRIB\_POSITION);
glVertexAttribPointer(GLProgram::VERTEX\_ATTRIB\_POSITION, 2, GL\_FLOAT, GL\_FALSE, sizeof(V2F\_C4B\_T2F), (GLvoid \*)offsetof(V2F\_C4B\_T2F, vertices));
// color
glEnableVertexAttribArray(GLProgram::VERTEX\_ATTRIB\_COLOR);
glVertexAttribPointer(GLProgram::VERTEX\_ATTRIB\_COLOR, 4, GL\_UNSIGNED\_BYTE, GL\_TRUE, sizeof(V2F\_C4B\_T2F), (GLvoid \*)offsetof(V2F\_C4B\_T2F, colors));
// texcood
glEnableVertexAttribArray(GLProgram::VERTEX\_ATTRIB\_TEX\_COORD);
glVertexAttribPointer(GLProgram::VERTEX\_ATTRIB\_TEX\_COORD, 2, GL\_FLOAT, GL\_FALSE, sizeof(V2F\_C4B\_T2F), (GLvoid \*)offsetof(V2F\_C4B\_T2F, texCoords));
if (Configuration::getInstance()->supportsShareableVAO())
{
glGenVertexArrays(1, &\_vaoGLPoint);
GL::bindVAO(\_vaoGLPoint);
}
glGenBuffers(1, &\_vboGLPoint);
glBindBuffer(GL\_ARRAY\_BUFFER, \_vboGLPoint);
glBufferData(GL\_ARRAY\_BUFFER, sizeof(V2F\_C4B\_T2F)\*\_bufferCapacityGLPoint, \_bufferGLPoint, GL\_STREAM\_DRAW);
// vertex
glEnableVertexAttribArray(GLProgram::VERTEX\_ATTRIB\_POSITION);
glVertexAttribPointer(GLProgram::VERTEX\_ATTRIB\_POSITION, 2, GL\_FLOAT, GL\_FALSE, sizeof(V2F\_C4B\_T2F), (GLvoid \*)offsetof(V2F\_C4B\_T2F, vertices));
// color
glEnableVertexAttribArray(GLProgram::VERTEX\_ATTRIB\_COLOR);
glVertexAttribPointer(GLProgram::VERTEX\_ATTRIB\_COLOR, 4, GL\_UNSIGNED\_BYTE, GL\_TRUE, sizeof(V2F\_C4B\_T2F), (GLvoid \*)offsetof(V2F\_C4B\_T2F, colors));
// texcood
glEnableVertexAttribArray(GLProgram::VERTEX\_ATTRIB\_TEX\_COORD);
glVertexAttribPointer(GLProgram::VERTEX\_ATTRIB\_TEX\_COORD, 2, GL\_FLOAT, GL\_FALSE, sizeof(V2F\_C4B\_T2F), (GLvoid \*)offsetof(V2F\_C4B\_T2F, texCoords));
glBindBuffer(GL\_ARRAY\_BUFFER, 0);
if (Configuration::getInstance()->supportsShareableVAO())
{
GL::bindVAO(0);
}
CHECK\_GL\_ERROR\_DEBUG();
\_dirty = true;
\_dirtyGLLine = true;
\_dirtyGLPoint = true;
#if CC_ENABLE_CACHE_TEXTURE_DATA
// Need to listen the event only when not use batchnode, because it will use VBO
auto listener = EventListenerCustom::create(EVENT_RENDERER_RECREATED, [this](EventCustom* event){
/** listen the event that renderer was recreated on Android */
this->init();//此处会一直添加监听,重复添加
});
\_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
#endif
return true;
}
手机扫一扫
移动阅读更方便
你可能感兴趣的文章