Uiview 在具有透明背景的Cocos2D中,在iOS 7中减速

Uiview 在具有透明背景的Cocos2D中,在iOS 7中减速,uiview,cocos2d-iphone,uiimageview,ios7,slowdown,Uiview,Cocos2d Iphone,Uiimageview,Ios7,Slowdown,我已经在Cocos2D中开发了一款游戏大约3年了,它利用透明的背景来显示UIView。这样做的原因是使视差背景仍像Cocos2D进行场景转换一样运行 我有一个新问题,从我升级到iOS 7开始。减速发生在以下情况的组合中: -仅当视差背景的帧位置已更改时 -如果我摧毁了一个能发射小精灵和粒子效果的敌人 所以这是这两件事的结合,只是偶尔会发生。发生减速时,帧速率的调试值不会下降。如果我加载一个新场景,它会恢复正常。有时,当我摧毁另一个敌人时,减速也会消失 我的视差视图中有代码,它在游戏中几乎每一帧都

我已经在Cocos2D中开发了一款游戏大约3年了,它利用透明的背景来显示UIView。这样做的原因是使视差背景仍像Cocos2D进行场景转换一样运行

我有一个新问题,从我升级到iOS 7开始。减速发生在以下情况的组合中:

-仅当视差背景的帧位置已更改时

-如果我摧毁了一个能发射小精灵和粒子效果的敌人

所以这是这两件事的结合,只是偶尔会发生。发生减速时,帧速率的调试值不会下降。如果我加载一个新场景,它会恢复正常。有时,当我摧毁另一个敌人时,减速也会消失

我的视差视图中有代码,它在游戏中几乎每一帧都运行。我把问题归结为一行:

-(void)updateImagePosWithPos:(CGPoint)pos{ // in game

    // create vel based on last currentPos minus new pos

    CGPoint vel = CGPointMake(currentPos.x-pos.x, currentPos.y-pos.y);

    // init variables tmpVel and tempTotalImages

    CGPoint tmpVel = CGPointZero;

    int tmpTotalImages = 0;

    // create indexLayerArr

    NSMutableArray *indexLayerArr = [NSMutableArray array];

    // for every parallax layer, add the number of images horizontally minus 1 to indexLayerArr

    for (int j=0; j<totalLayers; ++j){

        [indexLayerArr addObject:[NSNumber numberWithInt:[[totalImagesArr objectAtIndex:j] intValue]-1]];

    }

    int i = 0;


    for (UIImageView *imageView in self.subviews) {

        CGRect tmpRect = CGRectZero;

        NSMutableArray *tmpRectArr = [rectContainer objectAtIndex:imageView.tag];

        float speed = 0.00;


        tmpTotalImages = [[totalImagesArr objectAtIndex:imageView.tag] intValue];

        speed = [[speedArr objectAtIndex:imageView.tag] floatValue];

        tmpVel = CGPointMake(vel.x*speed, vel.y*speed);

        i = [[indexLayerArr objectAtIndex:imageView.tag] intValue];

        tmpRect = [[tmpRectArr objectAtIndex:i] CGRectValue];


        if(tmpRect.origin.x - tmpVel.x > wins.width){

            tmpRect.origin.x -= (tmpTotalImages)*tmpRect.size.width;

        }
        else if(tmpRect.origin.x - tmpVel.x < -tmpRect.size.width){

            tmpRect.origin.x += (tmpTotalImages)*tmpRect.size.width;

        }

        tmpRect.origin.x -= tmpVel.x;
        tmpRect.origin.y += tmpVel.y;

        [tmpRectArr replaceObjectAtIndex:i withObject:[NSValue valueWithCGRect:tmpRect]];


        imageView.frame = [[tmpRectArr objectAtIndex:i] CGRectValue]; // <-- slow down cause



        i--;

        [indexLayerArr replaceObjectAtIndex:imageView.tag withObject:[NSNumber numberWithInt:i]];


    }

    currentPos = CGPointMake(pos.x, pos.y);

}
请参阅注释行imageView.frame=[[tmprectar objectAtIndex:i]CGRectValue]

因此,如果我把这一行注释掉,问题就永远不会发生。如果我保持不变,并且不更改tempRect的值,那么问题也不会发生


在iOS 7中,更改UIImageView的帧位置似乎存在问题,但这只是偶尔出现的问题。我只是想知道我还能用什么替代品?或者我在iOS 7中确实做错了什么?

不是解决问题的方法,而是解决办法。我将从可能需要最多代码更改的一个开始

实际上,您不必使用UIView来保持背景和过渡。相反,如果将背景作为场景的一部分完全在cocos2d中实现,则如果不替换场景而将层移入和移出,则可以实现相同的效果。场景变换在大多数情况下使用的动作与节点上的动作相同

使用cocos2d节点实现后台,并让一个父节点充当后台节点的容器ie层。您可以使用该节点执行以下两项操作之一:

a。编辑CCDirectorIOS的代码并添加对后台节点的引用。在drawScene方法中的所有其他节点之前更新节点,方法是在[\u runningScene visit]之前调用后台节点上的visit

b。转换到新场景时,从当前场景中删除背景节点并将其添加到新场景中,或者使用所有相同设置创建背景副本并将其添加到新场景中。确保副本以与原始副本完全相同的状态开始。不过,由于动画的性质(即移动/翻转/缩放),这对大多数变换不起作用

如果在运行过渡时需要背景设置动画,有一个简单的技巧。在具有全局生存期ie AppDelegate的非CCNode对象上计划更新。然后手动将更新发送到所有节点,这些节点应在转换期间(并且仅在转换期间)继续更新其状态

可以在非节点对象上注册更新,如下所示:

[_director.scheduler scheduleUpdateForTarget:self priority:0 paused:NO];

即使在场景转换期间也会调用此更新方法。或者,也可以通过更改节点的暂停状态来继续更新节点,从而通过覆盖暂停属性或在发生转换时显式取消暂停特定节点来恢复计划程序和操作。

这是在设备上发生的吗,模拟器还是两者都有?它发生在设备上不幸的是,我没有答案,但我有一个建议,您可以更改:imageView.frame=[[tmprectar objectAtIndex:I]CGRectValue];只需imageView.frame=tmpRect;它应该可以为您节省一次数组查找,因为看起来tmpRect是您正在移动的值。谢谢,我没有注意到这一点!我已经修好了,但是减速还是会发生。你用仪器工具检查过有没有泄漏?