Ios 在cocos2d中显示加载图形,该图形不会滞后或结巴
在一些情况下,我想在我的cocos2d iPhone游戏准备就绪时显示某种加载图形/屏幕。例如,它可能在新场景的Ios 在cocos2d中显示加载图形,该图形不会滞后或结巴,ios,iphone,cocos2d-iphone,Ios,Iphone,Cocos2d Iphone,在一些情况下,我想在我的cocos2d iPhone游戏准备就绪时显示某种加载图形/屏幕。例如,它可能在新场景的init方法中创建CCSprite对象,通过[[CCTextureCache sharedTextureCache]addImage:fnTexture]缓存纹理,等等 不幸的是,所有这些操作都需要在cocos显示线程上运行。这意味着,当线程工作时,我试图创建一些漂亮的动画(例如,旋转图形)的任何尝试基本上都会被锁定,而我漂亮的动画会冻结 我可以想出三种可能的解决办法 在昂贵的操作之间
init
方法中创建CCSprite
对象,通过[[CCTextureCache sharedTextureCache]addImage:fnTexture]缓存纹理代码>,等等
不幸的是,所有这些操作都需要在cocos显示线程上运行。这意味着,当线程工作时,我试图创建一些漂亮的动画(例如,旋转图形)的任何尝试基本上都会被锁定,而我漂亮的动画会冻结
我可以想出三种可能的解决办法
在昂贵的操作之间插入人为延迟,让我的动画有时间更新。不幸的是,这仍然会导致紧张的动画,而且肯定会散发出“代码气味”
不知何故,为动画创建第二个cocos2d渲染线程,短期。。。?我找不到关于这是否可行的任何文档
使用粘贴在myOpenGL
视图上方的普通旧UIView
视图,它当然在主线程上运行,因此不受这些约束。。。然而,这需要弄清楚如何将我漂亮的动画编码到UIKit
2可能吗?或有没有更好的办法 在git上查看MBProgressHUD。我做了一个这样的快速测试(花了3分钟把它放到我的游戏中):
给我这个:
通过一些非常强烈的纹理预加载和场景设置/计算,它的动画效果非常出色。您可以在应用程序中找到“如何集成”。。。API很好(委托等)不幸的是,解决方案#3不起作用,因为iPhone上的cocos2d实际上将主线程用于cocos2d线程(但是,此解决方案将在OSX上起作用,因为它将单独的线程用于cocos2d)
我最终的解决方案是基于@learncos2d(如上)的回复。
首先,使用addImageAsync:
消除了大部分主线程锁定。剩下的延迟与创建CCNode
对象有关(例如,CCSprite
s)。我使用解决方案#1的一个变体,在我的loader类中创建预构建cocos对象的缓存,然后可以在以后重用(例如,在渲染层时),以避免在运行时需要分配对象。本质上,您所说的是从我的问题可能解决方案中执行#3。正如我在问题中所解释的,我真的不想这样做,因为我有非常定制的动画(坦白说,MBProgress看起来像垃圾)。但是,如果这是唯一的解决方案,那么我将继续将我的加载视图编码到UIKit.lol中,我不做美学评估。。。但是是的。选项3是我发现的唯一可行的方法,可以在不太参与创建自定义的情况下实现这一点。因为你在cocos2d的主线程上搁浅。。。嗯,你知道,我得想办法走出去,从我的设备中获取一些能量。我更喜欢旋转的剑。。。但是,唉,Marketroid先生希望游戏现在就结束,现在,现在:)。。。祝你好运。还有addImageAsync:它在背景中加载纹理。只有当你除了纹理之外还有其他资源文件需要很长时间才能加载时,我才会使用在单独线程上运行的非cocos2d动画,基本上UIKit进度指示器工作得很好。很好,我不知怎么错过了纹理加载上的异步方法。这肯定有帮助。
MBProgressHUD *hud = [[[MBProgressHUD alloc] init] autorelease];
hud.xOffset = kScreenWidth / 2;
hud.yOffset = kScreenHeight / 2;
hud.progress = .5;
[hud show:YES];
[hud setTaskInProgress:YES];
hud.labelText = @"Loading";
[[CCDirector sharedDirector].view addSubview:hud];