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を返します。
}