Ios skSpriteKit提高性能

Ios skSpriteKit提高性能,ios,iphone,performance,sprite-kit,Ios,Iphone,Performance,Sprite Kit,我正在写一个自上而下的赛车游戏。这有点像“开放世界”游戏,没有圈数,而是自由漫游。由于许多原因,我没有使用平铺贴图,因此我有一个2048x2048的大背景图像。移动此图像并不是性能缓慢的原因。在这个图像上,我插入了一些物理对象来创建墙。现在我插入了其他车辆来模拟交通,每辆车都通过一个永远重复的动作在cgpath上移动。每辆车对交通信号灯做出反应,并通过一个不可见的活动区域和自行车检查系统停车。这些车没有物理车身,因为在每辆车上添加物理车身会使游戏在只有3到4辆车之后表现不佳。。。因此,我写了一个

我正在写一个自上而下的赛车游戏。这有点像“开放世界”游戏,没有圈数,而是自由漫游。由于许多原因,我没有使用平铺贴图,因此我有一个2048x2048的大背景图像。移动此图像并不是性能缓慢的原因。在这个图像上,我插入了一些物理对象来创建墙。现在我插入了其他车辆来模拟交通,每辆车都通过一个永远重复的动作在cgpath上移动。每辆车对交通信号灯做出反应,并通过一个不可见的活动区域和自行车检查系统停车。这些车没有物理车身,因为在每辆车上添加物理车身会使游戏在只有3到4辆车之后表现不佳。。。因此,我写了一个方法,照顾接触,交通灯,停止等。。。它工作得很好,但在iPhone4上,我只能管理15辆车,然后性能就会很差。这个性能问题的第一个原因是我编写的方法。我正在尝试一种优化,在我的方法中,我有一些递归循环(例如:对于每次更新,我检查每辆车是否在另一个循环中,以检查其他车之间的联系…)

for(int i=0;i您可以从使用快速枚举开始进行许多“优化”:

for (SKSpriteNode* car1 in ArrayCars) 
{   
  CGRect Frame1 = car1.frame;

  for (SKSpriteNode* car2 in ArrayCars) 
  {
        CGRect Frame2 = car2.frame;

        if (CGRectEqualToRect(Frame1, Frame2) == NO && [car2 speed] == 0)
        {
            if ([self CheckIntersection:Frame2 :Frame1]) 
            {
              //set some flags that identifies the contact
            }
        }
    }
}
我打赌这会给你带来一些进步

下一个优化步骤是考虑不需要对每一个CAR2进行CAR1检查。基本上,如果检查CAR1和CAR2是否相撞,CAR2 vs CAR1的反向检查是多余的。 此变体将每个car1与所有car2进行检查。它跳过了对自身和之前任何车辆的检查,因为它们已经过检查。因此,每次外循环完成一次迭代时,内循环的迭代次数越来越少。数学不太好,但我相信这将使总迭代次数减半。不但是,不能对内部循环使用快速枚举

NSUInteger numCars = ArrayCars.count;
int otherCarsStartIndex = 0;

for (SKSpriteNode* car1 in ArrayCars) 
{   
  CGRect Frame1 = car1.frame;
  otherCarsStartIndex++;

  for (int i = otherCarsStartIndex; i < numCars; i++) 
  {
      SKSpriteNode* car2 = [ArrayCars objectAtIndex:i];

      // previous code omitted...
  }
}
nsuiger numCars=ArrayCars.count;
int otherCarsStartIndex=0;
用于(阵列中的SKSpriteNode*car1)
{   
CGRect Frame1=car1.frame;
otherCarsStartIndex++;
for(int i=otherCarsStartIndex;i
另一个优化是内联checkcrossion代码或将其重写为C函数,以避免ObjC消息传递开销

此外,如果您的大多数汽车在大多数情况下的速度==0,则如果您首先枚举ArrayCars以构建一个仅包含速度不为零的汽车的新数组,则可能会提高性能。新数组可能需要比原始汽车数约少一半或更少的汽车,否则填充新数组的开销可能会更大太高而看不到好处

最后,通过使用C风格的数组来存储汽车,您可以获得更高的性能,但这需要手动内存管理,并且没有像NSArray中那样防止缓冲区溢出/下溢


PS:请记住,与后继产品iPhone 4S相比,iPhone 4的速度非常慢。iPhone 4基本上是一款iPhone 3GS,具有33%的减速效果,需要在视网膜上绘制四倍的像素,这是一种过度的负担。

这可能更适合于代码审查:3-4个物理实体不应该降低您的性能。我有一个建议在我的游戏中20+轮,4s以60fps的速度运行
NSUInteger numCars = ArrayCars.count;
int otherCarsStartIndex = 0;

for (SKSpriteNode* car1 in ArrayCars) 
{   
  CGRect Frame1 = car1.frame;
  otherCarsStartIndex++;

  for (int i = otherCarsStartIndex; i < numCars; i++) 
  {
      SKSpriteNode* car2 = [ArrayCars objectAtIndex:i];

      // previous code omitted...
  }
}