2013-04-19 6 views
0

Привет, я замечаю, что следующий код создает заметный кусок запаздывания при его включении.Остановить функцию создания растровых изображений/уменьшить перегрузку процессора/уменьшить задержку

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 Совершенного обнаружение столкновений является дорогостоящим. Я не могу сказать, что это единственная проблема, но я могу сказать, что это дорого в плане обработки.

Создание нового растрового изображения для каждой итерации в этом цикле также дорого.

Одна вещь, которую вы можете попробовать - это устранить объекты, прежде чем выполнять более интенсивную проверку. Например, очень быстрая проверка расстояния может исключить необходимость проверки объекта, если они не находятся на определенном расстоянии.

if (distance <= threshold) 
{ 
    // create the bitmap for the check 
    // do the expensive pixel perfect collision check 
} 

Ваша цель - устранить объекты, которые, очевидно, недостаточно близко, чтобы столкнуться.

+0

спасибо помощник, сделал, как вы сказали, и, похоже, уменьшил отставание немного ура – Larry

Смежные вопросы