gpt4 book ai didi

ios - spriteKit 提高性能

转载 作者:行者123 更新时间:2023-11-29 12:37:29 28 4
gpt4 key购买 nike

我正在编写一个自上而下的赛车游戏。这有点像“开放世界”游戏,没有圈数,而是自由漫游。由于很多原因,我没有使用平铺 map ,所以我有一个 2048x2048 的大背景图像。移动此图像不是性能下降的原因。在这张图片上,我插入了一些物理对象来创建墙。现在我已经插入了其他汽车来模拟交通,每辆车都通过一个永远重复的滑行在 cgpath 上移动。每辆车响应交通信号灯并通过隐形事件区域和自行车 cgrectintersect 检查系统停止。这些车没有物理体,因为每辆车都添加了物理体,只有 3 或 4 辆车后游戏性能就会变差......所以我写了一个方法来处理联系人,红绿灯, parking 等......它工作正常,但在 iphone 4 上我只能管理 15 辆汽车,然后性能不佳。这个性能问题的第一个原因是我写的方法。我正在尝试优化,在我的方法中我有一些递归循环(例如:对于每次更新,我检查每辆汽车是否有另一个循环以检查其他汽车之间的联系...)

for (int i=0; i<[ArrayCars count]; i++) {   

CGRect Frame=[[ArrayCars objectAtIndex:i] frame];

for (int z=0; z<[ArrayCars count]; z++) {

CGRect Frame1=[[ArrayCars objectAtIndex:z] frame];
SKSpriteNode *Car=[ArrayCars objectAtIndex:z];


if (CGRectEqualToRect(Frame,Frame1)==NO && [Car speed]==0) {

if ([self CheckIntersection:Car.frame :Frame]) {

//set some flags that identifies the contact


}



}



}
}

我如何对这样的递归进行优化?我的方法是通过 update 方法启动的,但我已经尝试将它移动到 didEvaluateActions 中,但没有明显的收获。

最佳答案

从使用快速枚举开始,您可以进行许多“优化”:

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 与 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...
}
}

另一个优化是内联 CheckIntersection 代码或将其重写为 C 函数以避免 ObjC 消息传递开销。

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

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

PS:请记住,与其后续产品 iPhone 4S 相比,iPhone 4 的运行速度非常慢。 iPhone 4 基本上是 iPhone 3GS,具有 33% 的减速带,由于必须在其 Retina 显示屏上绘制四倍多的像素,因此负担过重。

关于ios - spriteKit 提高性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25910156/

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