我已经在 Cocos2D 中开发一款游戏大约 3 年了,它利用透明背景来显示 UIView。这样做的原因是让视差背景仍然像 Cocos2D 进行场景转换一样运行。
当我更新到 iOS 7 时,我遇到了一个新问题。结合以下情况会出现减速:
- 仅当视差背景的帧位置发生变化时。
- 如果我摧毁一个发射小精灵和粒子效果的敌人。
所以这是这两件事的结合,它只是有时会发生。发生减速时,帧速率的调试值不会下降。如果我加载一个新场景,它会恢复正常。有时当我摧毁另一个敌人时,减速也会消失。
我的视差 UIView 中有代码,几乎可以运行游戏中的每一帧。我将问题总结为一行:
-(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 = [[tmpRectArr objectAtIndex:i] CGRectValue];
因此,如果我将这条线注释掉,问题将永远不会发生。如果我保留这条线并且不更改 tempRect 的值,那么问题也不会发生。
看起来 iOS 7 在更改 UIImageView 的框架位置时存在问题,但只是有时。只是想知道我可以使用哪些其他替代品?还是我在 iOS 7 中做错了什么?