我正在开发一个使用cocos2d-x的游戏,我在ipad 1这样的老设备上遇到了问题,在这些设备上,大场景需要很长时间才能加载。所以场景转换需要几秒钟的时间,所以在加载新场景时,我尝试在场景转换之间实现一个“繁忙”动画。我在IOS上使用MBProgressHUD实现了这个功能,在android上使用ProgressDialog实现了这个功能。我决定我不想立即开始显示这个动画,相反,我可以安排动画在场景转换开始后1-2秒开始,这样在较新的设备上动画就不会显示。最初我所做的是:
- (void) showProgressDialog: (int) runWithoutDelay
{
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(showProgressDialogAfterDelay) object:nil];
shouldShow = YES;
if (runWithoutDelay){
[self showProgressDialogAfterDelay];
}
else{
[self performSelector:@selector(showProgressDialogAfterDelay) withObject:nil afterDelay:delay];
}
}
- (void) showProgressDialogAfterDelay
{
if (shouldShow){
isShown = YES;
[progressHUD show:YES];
}
}如果我传递场景转换部分,我只会将shouldShow标志设置为false,并且不会启动动画。问题是,由于cocos2d-x场景转换是在main\ui线程中完成的,有时不是在2秒后调用show方法,因此调用它需要6到8秒,有时甚至在我将标记设置为false之后调用。据我所理解,这是因为performSelector (以及我也尝试过的NSTimer )通过将调用放在线程运行循环队列中在同一个线程上运行。我需要一些需要延迟的东西,所以我尝试使用performSelectorInBackground (尽管我仍然不知道如何取消它,就像创建一个新的时间表时需要取消以前的计划一样),但根据Xcode的日志,这看起来更准确,但是即使日志上说这个方法是在被计划的2秒后调用的,显示时间还是需要5-8秒,有时甚至根本不显示。据我所知,如果我错了,请纠正我,因为MBProgressHUD更改UI必须发生在main\UI线程上,所以即使我调用ProgressHUD显示:是的,在后台线程上,UI的实际更新计划以某种方式在主线程上执行,而且由于它被卡在cocos2d-x上,所以在场景转换完成后,当场景转换完成时,它才会开始显示。
有办法解决这个问题吗?我可以以某种方式安排它以延迟开始,但是当我想要它的时候,它会显示正确吗?
我不明白的是,如果我毫不拖延地启动它,动画工作就会顺利,而不会被卡住,即使主线程忙于cocos2d-x处理。
发布于 2015-03-07 03:14:07
我设法绕过了这一切!
示例:
-(void)callHUD {
[progressHUD show];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self performSelectorOnMainThread:@selector(loadView) withObject:nil waitUntilDone:YES];
dispatch_async(dispatch_get_main_queue(), ^{
[progressHUD dismiss];
});
});
}
-(void)loadView {
//Perform your segue or transition which needs to load
}希望能对你有所帮助。
https://stackoverflow.com/questions/25548625
复制相似问题