最近將cocos2dx的程序移植到Android上, 某階段突然發(fā)現(xiàn)開(kāi)始閃退. 日志方式跟了很久, 發(fā)現(xiàn)有內(nèi)存被修改. 因?yàn)椴荒芟馰C那樣有內(nèi)存斷點(diǎn), 只有靠日志繼續(xù)跟蹤, 繞了很久, 終于發(fā)現(xiàn)一個(gè)問(wèn)題
CCApplication::sharedApplication()->run(); 在Windows下除了初始化回調(diào)外, 還有Windows平臺(tái)特殊的消息循環(huán). 既然是循環(huán), 這個(gè)run函數(shù)會(huì)一直阻塞到程序退出, 因此我自然的在run后添加自己的資源卸載
換到Android上呢CCApplication::sharedApplication()->run();的實(shí)現(xiàn)變了. 由于Android上沒(méi)有Windows的消息循環(huán), 所有事件都是通過(guò)java方式的事件通知. 因此CCApplication::sharedApplication()->run();變成了非阻塞, 可是我在run后添加了資源卸載. 結(jié)果導(dǎo)致系統(tǒng)剛初始化就卸載了資源, 內(nèi)存直接不可用, 導(dǎo)致后面cocos2dx的API部分使用無(wú)問(wèn)題, 而自己引擎的API調(diào)用閃退.
cocos2dx的這個(gè)run函數(shù)命名有嚴(yán)重問(wèn)題.. 被坑了好久, 還一直懷疑NDK內(nèi)存管理是否有特殊之處, 殊不知..