触摸屏幕时偶尔使用场景套件时出现卡顿



当我与屏幕交互时,游戏中的对象开始卡顿。我的 FPS 为 60 并且没有下降,但口吃仍然很普遍。我相信我的问题是我如何在屏幕上对对象进行动画处理(下面的代码(。如果有人能帮忙,我将不胜感激。

我在一个名为 _activePool 的数组中有 x 个节点。在更新函数中,我将节点 x 位置移动到_activePool内,当_activePool位置的最后一个节点为 <= 25 时添加新节点,如果位置为 <= -25,则删除_activePool中的第一个节点。

if _cycleIsActive{
for obj in _activePool{
//move the obj in _activePool
obj.position.x += Float(dt * self.speedConstant);
}
let lastObj = _activePool.last;
if (lastObj?.position.x)! + getWidthOfNode(node: lastObj!) + Float(random(min: 15, max: 20)) <= 25{
// get new obj(pattern) and add to _activePool
self.getPatternData(sequencePassedIn: selectedSeq, level: self._currentLevel, randomPattern: randomPattern());
}
let firstObj = _activePool.first;
if (firstObj?.position.x)! + getWidthOfNode(node: firstObj!) <= -25{
// remove object and return to specific pool
firstObj?.removeFromParentNode();
returnItems(item: firstObj!);
_activePool.removeFirst();
}
}

我创建了几个数组并将它们添加到字典中

func activatePools(){
temp1Pool = ObjectPool(tag: 1, data: []);
dictPool[(temp1Pool?.tag)!] = temp1Pool;
temp2Pool = ObjectPool(tag: 2, data: []);
dictPool[(temp2Pool?.tag)!] = temp2Pool;
for i in 0... dictPool.count {
obstacleCreationFactory(factorySwitch: i);
}
}

创造我的障碍(敌人(

func obstacleCreationFactory(factorySwitch: Int){
Enemies = Enemy();
switch factorySwitch {
case 0:
for _ in 0...100{
let blueEnemy = Enemies?.makeCopy() as! Enemy
blueEnemy.geometry = (Enemies?.geometry?.copy() as! SCNGeometry);
blueEnemy.geometry?.firstMaterial?.diffuse.contents = UIColor.blue;
blueEnemy.tag = 1;
temp1Pool?.addItemToPool(item: blueEnemy);
}
case 1:
for _ in 0...100{
let redEnemy = Enemies?.makeCopy() as! Enemy
redEnemy.geometry = (Enemies?.geometry?.copy() as! SCNGeometry);
redEnemy.geometry?.firstMaterial?.diffuse.contents = UIColor.red;
redEnemy.tag = 2;
temp2Pool?.addItemToPool(item: redEnemy);
}
default:
print("factory error");
}
}

如果无法查看代码库的其余部分,就很难猜测导致问题的原因。

如果在某处循环中创建大量临时对象,则可以考虑创建本地自动释放池以防止内存峰值。这是一篇很好的文章,描述了为什么在某些情况下这是一个好主意。

你也可以在计时器或其他东西上调用一些特别昂贵的函数。很难说。

简而言之,您应该考虑使用 Xcode 的分析工具(称为 Instruments(。具体来说,我建议使用时间探查器来检查哪些函数花费的时间最多并导致这些峰值。

这是一个很棒的 WWDC 会话视频,展示了如何使用时间探查器,我建议定期分析您的应用程序,尤其是当您遇到此类问题时。

最新更新