【发布时间】:2021-07-28 22:05:12
【问题描述】:
我的场景很简单:我使用 cocos2d-x 制作了一个游戏,我想为多人用户下载图像(FB 和 Google play),并在下载完成后将它们显示为按钮的纹理。 在理想世界中,事情按预期工作。 当这些按钮在下载完成之前被删除时,事情会变得很棘手。 所以回调函数处于奇怪的状态,然后我得到信号 11(SIGSEGV),代码 1(SEGV_MAPERR) 应用程序崩溃 这就是我实现它的方式 我有一个名为 PlayerIcon 的布局类。 cpp看起来像这样
void PlayerIcon::setPlayer(string userName, string displayName, string avatarUrl){
try {
//some code here
downloadAvatar(_userName, _avatarUrl);
//some code here
}
catch(... ){
}
}
void PlayerIcon::downloadAvatar(std::string _avatarFilePath,std::string url) {
if(!isFileExist(_avatarFilePath)) {
try {
auto downloader = new Downloader();
downloader->onFileTaskSuccess=CC_CALLBACK_1(PlayerIcon::on_download_success,this);
downloader->onTaskError=[&](const network::DownloadTask& task,int errorCode,
int errorCodeInternal,
const std::string& errorStr){
log("error while saving image");
};
downloader->createDownloadFileTask(url,_avatarFilePath,_avatarFilePath);
}
catch (exception e)
{
log("error while saving image: test");
}
} else {
//set texture for button
}
}
void PlayerIcon::on_download_success(const network::DownloadTask& task){
_isDownloading = false;
Director::getInstance()->getScheduler()-> performFunctionInCocosThread(CC_CALLBACK_0(PlayerIcon::reload_avatar,this));
}
void PlayerIcon::reload_avatar(){
try {
// setting texture in UI thread
}
catch (...) {
log("error updating avatar");
}
}
正如我所说,在下载完成之前删除 PlayerIcon 之前一切正常。 我不知道当下载任务的回调指向已删除(或标记为删除)的 un 对象的方法时会发生什么。 我查看了下载器实现,它没有提供任何取消机制 我不知道如何处理这个
另外,cocos2dx 游戏在谷歌控制台有 10% 的崩溃率是正常的吗? 非常感谢任何帮助
【问题讨论】:
标签: multithreading download cocos2d-x