Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在cocos2d中显示加载图形,该图形不会滞后或结巴_Ios_Iphone_Cocos2d Iphone - Fatal编程技术网

Ios 在cocos2d中显示加载图形,该图形不会滞后或结巴

Ios 在cocos2d中显示加载图形,该图形不会滞后或结巴,ios,iphone,cocos2d-iphone,Ios,Iphone,Cocos2d Iphone,在一些情况下,我想在我的cocos2d iPhone游戏准备就绪时显示某种加载图形/屏幕。例如,它可能在新场景的init方法中创建CCSprite对象,通过[[CCTextureCache sharedTextureCache]addImage:fnTexture]缓存纹理,等等 不幸的是,所有这些操作都需要在cocos显示线程上运行。这意味着,当线程工作时,我试图创建一些漂亮的动画(例如,旋转图形)的任何尝试基本上都会被锁定,而我漂亮的动画会冻结 我可以想出三种可能的解决办法 在昂贵的操作之间

在一些情况下,我想在我的cocos2d iPhone游戏准备就绪时显示某种加载图形/屏幕。例如,它可能在新场景的
init
方法中创建
CCSprite
对象,通过
[[CCTextureCache sharedTextureCache]addImage:fnTexture]缓存纹理,等等

不幸的是,所有这些操作都需要在cocos显示线程上运行。这意味着,当线程工作时,我试图创建一些漂亮的动画(例如,旋转图形)的任何尝试基本上都会被锁定,而我漂亮的动画会冻结

我可以想出三种可能的解决办法

  • 在昂贵的操作之间插入人为延迟,让我的动画有时间更新。不幸的是,这仍然会导致紧张的动画,而且肯定会散发出“代码气味”
  • 不知何故,为动画创建第二个cocos2d渲染线程,短期。。。?我找不到关于这是否可行的任何文档
  • 使用粘贴在my
    OpenGL
    视图上方的普通旧
    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];