初期化DrawNodeにおける方法論的問題0-004.cocos2dx [COCOS2DX-LUA]

1.インセンティブ

  最近、Buglyへのプロジェクトへのアクセスは、いくつかの異常なテストが出てこない、または困難なバグを再現するために報告された、バグのこの種は、トラブルシューティングが非常に困難です。まず、問題が再現できない二つの理由が、ありますが、第二、結果をすぐに確認することができませんでした改訂。問題は、私にこのエラーコードが報告されている長い時間を、悩ますあります。(は、dispatchEventエラー)

ボイドJava_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit(JNIEnvの* ENV、jオブジェクトJINTのH、W thiz、JINT)
{ 
    オートディレクター= cocos2d ::監督::のgetInstance(); 
    自動glview = director-> getOpenGLView(); 
    もし(glview!)
    { 
        glview = cocos2d :: GLViewImpl ::( "Androidアプリ")を作成します。
        glview-> setFrameSize(H、W)。
        director-> setOpenGLView(glview)。

        // cocos_android_app_init(ENV、thiz)。

        cocos2d ::アプリケーション::のgetInstance() - >ファイル名を指定して実行(); 
    } 
    { 
        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(設定::の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)。
    //頂点
    glEnableVertexAttribArray(GLProgram :: VERTEX_ATTRIB_POSITION)。
    glVertexAttribPointer((V2F_C4B_T2F、頂点)offsetofはGLProgram :: VERTEX_ATTRIB_POSITION、2、GL_FLOAT、GL_FALSE、はsizeof(V2F_C4B_T2F)、(GLvoid *))。
    //色
    glEnableVertexAttribArray(GLProgram :: VERTEX_ATTRIB_COLOR)。
    glVertexAttribPointer((V2F_C4B_T2F、色)offsetofはGLProgram :: VERTEX_ATTRIB_COLOR、4、GL_UNSIGNED_BYTE、GL_TRUE、はsizeof(V2F_C4B_T2F)、(GLvoid *))。
    // texcood 
    glEnableVertexAttribArray(GLProgram :: VERTEX_ATTRIB_TEX_COORD)。
    glVertexAttribPointer((V2F_C4B_T2F、texCoords)offsetofはGLProgram :: VERTEX_ATTRIB_TEX_COORD、2、GL_FLOAT、GL_FALSE、はsizeof(V2F_C4B_T2F)、(GLvoid *)); 
    
    もし(設定::の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)。
    //頂点
    glEnableVertexAttribArray(GLProgram :: VERTEX_ATTRIB_POSITION)。
    glVertexAttribPointer((V2F_C4B_T2F、頂点)offsetofはGLProgram :: VERTEX_ATTRIB_POSITION、2、GL_FLOAT、GL_FALSE、はsizeof(V2F_C4B_T2F)、(GLvoid *))。
    //色
    glEnableVertexAttribArray(GLProgram :: VERTEX_ATTRIB_COLOR)。 
    glEnableVertexAttribArray(GLProgram :: VERTEX_ATTRIB_TEX_COORD)。
    glVertexAttribPointer((V2F_C4B_T2F、色)offsetofはGLProgram :: VERTEX_ATTRIB_COLOR、4、GL_UNSIGNED_BYTE、GL_TRUE、はsizeof(V2F_C4B_T2F)、(GLvoid *))。
    // texcood 
    glVertexAttribPointer(GLProgram :: VERTEX_ATTRIB_TEX_COORD、2、GL_FLOAT、GL_FALSE、はsizeof offsetofは(V2F_C4B_T2F)、(GLvoid *)(V2F_C4B_T2F、texCoords)); 
    
    IF(設定::の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)。
    //頂点
    glEnableVertexAttribArray(GLProgram :: VERTEX_ATTRIB_POSITION)。
    glVertexAttribPointer((V2F_C4B_T2F、頂点)offsetofはGLProgram :: VERTEX_ATTRIB_POSITION、2、GL_FLOAT、GL_FALSE、はsizeof(V2F_C4B_T2F)、(GLvoid *))。
    // 色
    glEnableVertexAttribArray(GLProgram :: VERTEX_ATTRIB_COLOR)。
    glVertexAttribPointer((V2F_C4B_T2F、色)offsetofはGLProgram :: VERTEX_ATTRIB_COLOR、4、GL_UNSIGNED_BYTE、GL_TRUE、はsizeof(V2F_C4B_T2F)、(GLvoid *))。
    // texcood 
    glEnableVertexAttribArray(GLProgram :: VERTEX_ATTRIB_TEX_COORD)。
    glVertexAttribPointer((V2F_C4B_T2F、texCoords)offsetofはGLProgram :: VERTEX_ATTRIB_TEX_COORD、2、GL_FLOAT、GL_FALSE、はsizeof(V2F_C4B_T2F)、(GLvoid *)); 

    glBindBuffer(GL_ARRAY_BUFFER、0); 
    IF(設定::のgetInstance() - > supportsShareableVAO())
    { 
        GL :: bindVAO(0)。 
    } 
    
    CHECK_GL_ERROR_DEBUG()。
    
    _dirty =はtrue。
    _dirtyGLLine =はtrue。
    _dirtyGLPoint =はtrue。
    
CC_ENABLE_CACHE_TEXTURE_DATAの#if 
        //それはVBOを使用するので、batchnodeを使用しない場合にのみ、イベントをリッスンする必要が
        自動リスナー= EventListenerCustomを::(EVENT_RENDERER_RECREATED、[この](EventCustom *イベント)を作成し、{ 
       / **レンダラが再作成されたというイベントを聞きますAndroid上* /         this->のinit(); //此处会一直添加监听、重复添加 
        }); 
        _eventDispatcher-> addEventListenerWithSceneGraphPriority(リスナー、この)。
#endifの
    trueを返します。
}
    

    

おすすめ

転載: www.cnblogs.com/superdo/p/11386756.html