Ios 在Xcode中生成无限多的对象

Ios 在Xcode中生成无限多的对象,ios,xcode,timer,uiimage,Ios,Xcode,Timer,Uiimage,我现在正在做一个游戏,在这个游戏中,每秒钟,我都要创建x个新的UIImage对象,从屏幕顶部开始。在它们被实例化之后,我希望它们自动落下,直到它们到达屏幕底部,此时我不再使用它们 它几乎就像雨滴——每秒产生X个雨滴,它们以不同的速度落下 我真的很困惑我该如何设计我的程序来实现这一点 任何帮助都将不胜感激。谢谢。查看WWDC 2011,接近尾声时有一个关于“Replicators”的内容,听起来和您想要的完全一样。它们是同一图像的所有副本,还是在有限的一组图像中至少有一个的副本? 对于这样的游戏,

我现在正在做一个游戏,在这个游戏中,每秒钟,我都要创建x个新的UIImage对象,从屏幕顶部开始。在它们被实例化之后,我希望它们自动落下,直到它们到达屏幕底部,此时我不再使用它们

它几乎就像雨滴——每秒产生X个雨滴,它们以不同的速度落下

我真的很困惑我该如何设计我的程序来实现这一点


任何帮助都将不胜感激。谢谢。

查看WWDC 2011,接近尾声时有一个关于“Replicators”的内容,听起来和您想要的完全一样。

它们是同一图像的所有副本,还是在有限的一组图像中至少有一个的副本? 对于这样的游戏,图形密集型的应用程序,我会认真考虑使用OpenGL ES,虽然学习曲线是陡峭的人熟悉UIKIT只。幸运的是,有第三方的开源库,如Cocos2d,可以使高效的二维图形几乎像UIKit一样易于编码

特别是关于你的问题,我没有看过@ctrahey提到的视频,但我能想到这些模式:

  • 拥有可重用对象的(有限的)“池”,其大小等于在任何给定时间可能出现在屏幕上的最大实例数。您肯定要设置此限制,因为图形性能不是无限的。每次对象从屏幕上掉下来,“重置”其状态并重新使用(再次从顶部)。UITableView对表格单元格执行类似操作

  • 按需创建实例,并在它们离开屏幕后销毁它们(release->dealloc)

  • 您必须平衡创建/销毁实例的运行时成本与重置对象的成本/不便


    希望它能帮助你

    供参考:找到了一个非常好的资源来处理这个确切的场景。它确实要求您使用cocos2d,但它以一种非常清晰易懂的方式对其进行了解释


    步骤1:每秒运行一段代码

    timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(dispatchSomeRaindrops) userInfo:nil repeats:YES];
    
    第2步:创建一些粒子,将它们发送到屏幕下方,当它们到达底部时将其清理干净

    - (void)dispatchSomeRaindrops
    {
        for (int i = 0; i < 5; i++) {
            UIImageView *view = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"safari.png"]];
    
            CGFloat halfHeight = view.frame.size.height / 2;
            CGFloat x = arc4random() % (int)self.view.frame.size.width;
            view.center = CGPointMake(x, -halfHeight);
    
            [self.view addSubview:view];
    
            NSTimeInterval duration = 10 + arc4random() % 10;
            [UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionCurveEaseIn animations:^{
                float endY = self.view.frame.size.height + halfHeight;
                view.center = CGPointMake(x, endY);
            } completion:^(BOOL finished) {
                [view removeFromSuperview];
            }];
        }
    }
    
    -(无效)发送一些雨滴
    {
    对于(int i=0;i<5;i++){
    UIImageView*视图=[[UIImageView alloc]initWithImage:[UIImageName:@“safari.png”];
    CGFloat半高=view.frame.size.height/2;
    CGFloat x=arc4random()%(int)self.view.frame.size.width;
    view.center=CGPointMake(x,-半高);
    [self.view addSubview:view];
    NSTimeInterval duration=10+arc4random()%10;
    [UIView animateWithDuration:持续时间延迟:0选项:UIViewAnimationOptionCurveEaseIn动画:^{
    float endY=self.view.frame.size.height+半高;
    view.center=CGPointMake(x,endY);
    }完成:^(布尔完成){
    [视图从SuperView移除];
    }];
    }
    }
    
    谢谢。我现在想做的是将每个新的UIImage对象放入一个NSMutableArray,然后以某种方式删除掉屏幕上的对象。这样,也许我也可以同时更新NSMutableArray中的每个元素。你肯定希望所有的“地图对象”(也使用游戏术语)都在一个数组中,以便轻松管理它们
    -makeObjectsPerformSelector:
    很方便。您可能需要检查每个粒子的“高度”(例如每个帧),并删除/重用到达底部的粒子。我强烈建议重用,而不是对每一帧进行大量的
    alloc/init
    dealloc
    s。但是
    UIImage
    在使用最近使用的图像创建新实例时会缓存纹理(图像)数据,因此不应该出现这样的问题。