2013/01/04

cocos2d-x Android版背景回前景資源讀取過久出現ANR的解法

2013/6/19   2.1.3 已解決這個問題  請使用2.1.3以上版本


cocos2d-x在Android平台上對Texture的做法與iOS版有個不同之處
就是當從背景回到前景時會將所有圖像資源重新讀取一次
在資源重讀開始到結束前會將Thread給卡住
如果你遊戲中的圖像資源很多的時候
重讀的時間有可能超出Android規範的5秒而出現ANR

要解決這個問題
當時因為時間問題採取我覺得比較快的做法
步驟大概如下(使用2.0.3版)

修改main.cpp
將Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit中的CCTextureCache::reloadAllTextures() 刪掉
這樣就不會運行CCTextureCache.cpp中的VolatileTexture::reloadAllTextures()
然後增加一個新的Scene 
裡面加一個Layer並使用scheduleUpdate
並在Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit中push這個Scene
之後在VolatileTexture這個類別增加方法
方法怎樣寫都可以
但主要是要能夠在scheduleUpdate取用
使其在每一次update依序取用VolatileTexture中textures的元素進行重讀動作
這樣就不會卡住Thread
也就不會出現ANR

另外有想到一個做法
可以修改使CC_ENABLE_CACHE_TEXTURE_DATA不被定義
就不會跑VolatileTexture::reloadAllTextures()
然後在回到遊戲時再將全部資源與物件重載並恢復遊戲狀態
但這做法要考慮的東西比較多需要比較久的時間

至於cocos2d-x 在Android版之所以需要重讀是因為目前在進背景時圖像資源會被放掉
似乎有要在之後的版本處理這個問題
可見以下issue

沒有留言 :