[COCOS2DX-LUA]0-004.cocos2dx中的DrawNode的init的方法问题
阅读原文时间:2023年07月14日阅读:1

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;  

}

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章