触摸屏幕时偶尔会出现SceneKit口吃

时间:2018-08-17 01:20:41

标签: swift rendering scenekit

当我与屏幕互动时,游戏中的对象开始变得口吃。我的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");
        }
    }

1 个答案:

答案 0 :(得分:0)

由于无法查看代码的其余部分,因此很难猜测会导致问题的原因。

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

您还可能在计时器上调用了一些特别昂贵的函数。很难说。

简而言之,您应该考虑使用Xcode的分析工具(称为“工具”)。特别是,我建议使用Time Profiler来检查哪些功能占用最多的时间并导致这些峰值。

Here是一个很棒的WWDC会话视频,显示了如何使用时间分析器,我建议您定期对应用程序进行性能分析,尤其是在遇到此类问题时。