嘿伙计们,所以我正在创建一个游戏,当我在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; }
但我甚至不知道从哪里开始。过去我的技能水平。
但是你能看到任何方法来优化这些for循环吗?
答案 0 :(得分:0)
我认为警告是由内循环中的hitTestObject调用引起的:
if (currenMainMissle.hitTestObject(currentZapper))
hitTestObject(...)是一个相对较慢的过程,因此如果您循环执行许多命中测试,可能需要很长时间 - 因此来自Scout的警告。
优化循环(例如在代码之后的论坛中提到的方式)将产生可忽略的差异 - 循环中花费的时间的99%将归因于hitTestObject。
'技巧'是减少你所做的hitTestObject调用的次数 - 例如检查2个对象的x和y值是否在一定范围内 - 如果不是,则不需要检查碰撞。
或者当发生碰撞(导弹被移除)时,无需继续循环进行进一步的检查,所以在此之后:
updateScoreText();
添加以下行:
break;
这将导致内循环结束(并开始下一个外循环)
优化碰撞检测是一个广泛的主题,有很多技术,所以我不能为你的情况提供一个特定的解决方案,而不知道游戏的细节 - 谷歌搜索“动作脚本碰撞检测”应该提供一些教程。