2013-04-14 122 views
0

嘿家伙,所以我正在创建一个游戏,当我在Adobe Scout中测试它时说明了这个函数正在使它超过600%的预算checkMainGunMissleHitZapper();优化双循环

所以我想知道如果他们是一种方法来优化它。这是双重循环,因为导弹是阵列,敌人也是由数组处理的。

每当在两个对象之间发生命中测试时,屏幕就会完全暂停并主要在移动设备上降低性能。

这里是我设置的循环:

private function checkMainGunMissleHitZapper():void 
    { 
     //loop through al current missles 
     for (var i:int = 0; i < aMainGunMissleArray.length; i++) 
     { 
      //get current missle in loop 
      var currenMainMissle:mcMainGunMissle = aMainGunMissleArray[i]; 

      //loop through all our enemies 
      for (var j:int = 0; j < aEnemyZapperArray.length; j++) 
      { 
       //get current enemy in j loop 
       var currentZapper:mcEnemyZapper = aEnemyZapperArray[j]; 

       //test if current missle is hitting current enemy 
       if (currenMainMissle.hitTestObject(currentZapper)) 
       { 
        //create an explosion 

        //create a new explosion instance/movieclip 
        var newZapperExplosion:mcEnemyZapperExplosion = new mcEnemyZapperExplosion() 
        //add our explosion to the stage 
        stage.addChild(newZapperExplosion) 
        //position explosion to enemy 
        newZapperExplosion.x = currentZapper.x 
        newZapperExplosion.y = currentZapper.y 


        //remove missle 
        currenMainMissle.destroyMainGunMissle() 
        //remove missle from missle array 
        aMainGunMissleArray.splice(i, 1); 

        //remove enemy on stage 
        currentZapper.destroyEnemyZapper() 
        //remove enemy from array 
        aEnemyZapperArray.splice(j, 1); 

        nScore += 20; 
        updateScoreText(); 


       } 

      } 
     } 
    } 

有些论坛,我读都在说,这将优化代码:

for (int k = 0; k < N * N; ++k) { int i = k/N; int j = k % N; } 

但我甚至不会知道从哪里开始与。过去我的as3技能水平。

但你能看到任何方法来优化这些for循环?

+0

通常情况下,通过将游戏区域划分为网格并将导弹/敌人分配到其当前网格平方(每平方2个阵列;一个用于导弹,一个用于目标)来解决多体对多碰撞问题。 。这大大减少了命中测试的次数(通常只检查相同的盒子/最近的邻居)。 – Dave

+0

有趣的生病检查,谷歌。谢谢! – Nathan

+0

你应该做的另一件事是尽可能使用半径检查; 'dx * dx + dy * dy Dave

回答

0

我认为该警告是由于内环内的hitTestObject电话:

if (currenMainMissle.hitTestObject(currentZapper)) 

hitTestObject(...)是一个相对缓慢的过程,因此,如果您是通过许多热门的测试循环,它可以需要很长时间 - 因此Scout的警告。

优化循环(例如您在代码之后在论坛中提到的方式)将产生微不足道的差异 - 在循环中花费的时间的99%将归因于hitTestObject。 '技巧'是减少你所做的hitTestObject调用次数 - 例如检查2个对象的x和y值是否在一定范围内 - 如果它们不是,不需要检查碰撞。

或者当有冲突(和导弹被删除),没有必要继续通过进一步检查循环,所以此行之后:

updateScoreText(); 

加入这一行:

break; 

这将导致内部循环结束(和下一个外部循环开始)

优化碰撞检测是一个很大的课题,有很多技术,所以我不能给你一个特定的解决方案你的情况不知道你的游戏的细节 - 谷歌搜索“动作碰撞检测”应该提供一些教程。

+0

好吧,我明白了。感谢您所提供的所有信息。我在代码中添加了中断,它似乎更快。只有在第一次冲击测试开始之后,冲刺才会出现,看起来平平了。那么你认为我应该改变它到hitTestPoint?而不是最冲击的对象? – Nathan

+0

我明白计时器事件显着减慢它以及正确?我有大约4个计时器。敌人加分以及弹药 – Nathan

+0

我不能告诉你是否使用hitTestPoint - 取决于你的情况 - 但是戴维在你的问题发表了评论,大多数游戏不使用则hitTest方法,因为它们是太慢了。如果你能弄个如果它,我强烈推荐这本书:http://www.amazon.com/Foundation-Actionscript-3-0-Animation-Making/dp/1590597915/ref=sr_1_4?ie=UTF8&qid=1366037543&sr= 8-4&keywords = advanced + actionscript + 3 + friendsofed - 它有很多关于创建自己的(高效)碰撞检测方法的大量信息。 – 2013-04-15 14:56:10