gpt4 book ai didi

iOS 8 如何防止 Spritekit 帧率下降

转载 作者:行者123 更新时间:2023-11-29 02:33:47 25 4
gpt4 key购买 nike

在我创建的游戏中,我创建了一种游戏模式,玩家有 30 秒的时间击中尽可能多的目标。我在 -(void)update:(CFTimeInterval)currentTime 方法中添加了一个 30 秒的倒数计时器。当倒计时开始时,帧速率显着下降,每当物体与目标发生碰撞时,就会使用 99% 的 cpu。当计时器未运行时,不会发生这种情况。还有另一种添加倒数计时器的方法吗?如果不是,我怎样才能减少CPU使用率并保持帧速率恒定?我正在使用 Xcode 6.1,代码如下。这也是 iOS 8 的问题。在 iOS 7.1 上运行良好。

-(void)update:(CFTimeInterval)currentTime {
/* Called before each frame is rendered */
//reset counter if starting
int highscoret = [[NSUserDefaults standardUserDefaults] integerForKey: @"highScoret"];
if (startGamePlay){
startTime = currentTime;
startGamePlay = NO;
}
countDown.text = [NSString stringWithFormat:@"Start!"];

int countDownInt = 30.0 -(int)(currentTime-startTime);
if(countDownInt>0){ //if counting down to 0 show counter
countDown.text = [NSString stringWithFormat:@"%i", countDownInt];
}else if(countDownInt==0) { //if not show message, dismiss, whatever you need to do.
countDown.text=@"Time's Up!";

self.highScoret.text = [NSString stringWithFormat:@"%d Baskets",highscoret];
SKScene *endGameScene = [[GameOverT alloc] initWithSize:self.size];
SKTransition *reveal = [SKTransition fadeWithDuration:0.5];
[self.view presentScene:endGameScene transition:reveal];
[self saveScore2];

if (self.points > highscoret) {
self.highScoret.text = [NSString stringWithFormat:@"%d Points",highscoret];
[self saveScore];
self.points = 0;
self.scoreLabel.text = [NSString stringWithFormat:@"%d Points",_points];
}

else {
self.points = 0;
self.scoreLabel.text = [NSString stringWithFormat:@"%d Points",_points];
self.highScoret.text = [NSString stringWithFormat:@"%d Points",highscoret];
}


}
}

这是其他相关代码

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
/* Called when a touch begins */
for (UITouch *touch in touches) {
CGPoint location = [touch locationInNode:self];
if (CGRectContainsPoint(countDown.frame, location)){
startGamePlay = YES;
self.baskett = 0;
[self reset];
}
}

UITouch * touch = [touches anyObject];
CGPoint location = [touch locationInNode:self];

SKSpriteNode * object = [SKSpriteNode spriteNodeWithImageNamed:@"object.png"];
object.position = self.object2.position;

object.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:ball.size.width/2];
object.physicsBody.dynamic = YES;
object.physicsBody.categoryBitMask = objectCategory;
object.physicsBody.contactTestBitMask = targetCategory;
object.physicsBody.collisionBitMask = 0;
object.physicsBody.usesPreciseCollisionDetection = YES;
CGPoint offset = rwSub(location, object.position);

if (offset.y <= 0) return;

[self addChild:object];

CGPoint direction = rwNormalize(offset);

CGPoint shootAmount = rwMult(direction, 1000);

CGPoint realDest = rwAdd(shootAmount, object.position);

float velocity = 200/1.0;
float realMoveDuration = self.size.width / velocity;
SKAction * actionMove = [SKAction moveTo:realDest duration:realMoveDuration];
SKAction * actionMoveDone = [SKAction removeFromParent];
[object runAction:[SKAction sequence:@[actionMove, actionMoveDone]]];
}

-(void)object:(SKSpriteNode *) object didCollideWithTarget:(SKSpriteNode *) target {
[object removeFromParent];

[[self scene] runAction:[SKAction playSoundFileNamed:@"effect2.wav" waitForCompletion:NO]];
self.points++;
self.scoreLabel.text = [NSString stringWithFormat:@"%d Points",_points];

if (self.points == 3) {
[self obstacle];
}

}

最佳答案

更新函数中的计时器不是一个好主意,将 skaction 与 waitForDuration 一起使用可能会解决您的问题

SKAction *updateTime= [SKAction sequence:@[
///fire function after one second
[SKAction waitForDuration:1.0f],
[SKAction performSelector:@selector(callFunction)
onTarget:self]

]];
//where 30 is number of time you want’s to call your function
[self runAction:[SKAction repeatAction:updateTime count:30] ];




-(void) callFunction
{

//what ever you want to do
}

关于iOS 8 如何防止 Spritekit 帧率下降,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26599503/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com