Остановить функцию создания растровых изображений / уменьшить перегрузку процессора / уменьшить задержку
Привет, я замечаю, что следующий код производит заметный кусок лага, когда он включен.
public function impassable_collisions():void { //prevent player from moving through impassable mcs
for each(var mc:MovieClip in impassable) {
var bitmap = createBitmapClone(mc); //return clone of bitmap of mc, accounting for transformations
var bounds:Rectangle = player.getRect(bitmap);
var playerCenterX:Number = bounds.left + bounds.width * .5;
var playerCenterY:Number = bounds.top + bounds.height * .5;
//Test for a pixel perfect collision against a shape based on a point and radius,
//returns the angle of the hit or NaN if no hit.
var hitAngle:Number = hitTestPointAngle(bitmap, playerCenterX, playerCenterY, player.height/2);
if(!isNaN(hitAngle)){
// move player away from object
player.x -= int(Math.cos(hitAngle) * player.speed*timeDiff);
player.y -= int(Math.sin(hitAngle) * player.speed*timeDiff);
}
}
}
Таким образом, эта функция вызывается из другой функции, которая вызывается из прослушивателя enterFrame. Я зацикливаюсь на массиве, который может содержать от 5 до 30 мувиклипов в любой момент времени, а затем данный mc будет клонирован в растровое изображение, и это растровое изображение будет использоваться для проверки коллизий между собой и другим растровым изображением ("игрок")., Я предполагаю, что происходит что-то довольно неэффективное и, таким образом, возникают лаги - более прерывистые движения, когда "игрок" перемещается. У кого-нибудь есть идея, в чем проблема / пути ее решения?
Извините за довольно расплывчатое название вопроса
Спасибо
1 ответ
Pixel Perfect обнаружение столкновений стоит дорого. Не могу сказать, что это единственная проблема, но я могу сказать, что это дорого с точки зрения обработки.
Создание нового растрового изображения для каждой итерации в этом цикле также является дорогостоящим.
Одна вещь, которую вы можете попробовать, это удалить объекты перед выполнением более интенсивной проверки. Например, очень быстрая проверка расстояния может устранить необходимость проверки объекта, если он не находится на определенном расстоянии.
if (distance <= threshold)
{
// create the bitmap for the check
// do the expensive pixel perfect collision check
}
Ваша цель состоит в том, чтобы устранить объекты, которые явно не достаточно близко, чтобы столкнуться.