gpt4 book ai didi

swift - 触摸屏幕时 SceneKit 偶尔出现卡顿

转载 作者:行者123 更新时间:2023-11-30 11:14:21 24 4
gpt4 key购买 nike

当我与屏幕交互时,游戏中的对象开始出现卡顿。我的 FPS 为 60,并没有下降,但卡顿现象仍然很普遍。我相信我的问题是如何为屏幕上的对象设置动画(下面的代码)。如果有人可以提供帮助,我将不胜感激。

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

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");
}
}

最佳答案

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

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

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

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

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

关于swift - 触摸屏幕时 SceneKit 偶尔出现卡顿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51887228/

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